2014-01-10 3 views
0

У меня есть dataframe «samp» со столбцом (назовем его «рейтинг»), который принимает несколько значений (скажем, одно из следующего: «хороший», «средний» »,« bad ».)Выполнение подсчета для столбца кадра данных в R

Я хотел бы сгруппировать по нескольким другим столбцам и подсчитать частоту« хорошего »,« среднего »и« плохого »и сообщить эти частоты в новых столбцах. (Так что, может быть, col1 в год кино, col2 это жанр, а затем должна быть больше трех колонок, рассказывающих о том, сколько каждом типе рейтинга были за каждый год и жанр.)

ddply(samp,c("col1","col2"), summarize, 
     good=table(samp$rating)["good"], 
     medium=table(samp$rating)["medium"], 
     bad=table(samp$rating)["bad"]) 

Проблема заключается в том (я подумайте), что функции, которые я определяю, не относятся к группам, которые выводит ddply, это просто постоянные функции samp. Как я могу определить здесь функции, чтобы они были функциями групп?

Я попытался с помощью анонимной функции:

ddply(samp,c("col1","col2"), summarize, 
     good=function(df)table(df$rating)["good"], 
     medium=function(df)table(df$rating)["medium"], 
     bad=function(df)table(df$rating)["bad"]) 

Я не могу получить его работу, хотя. Я думаю, что ошибка, которую я получил от этого, -

Error in output[[var]][rng] <- df[[var]] : 
incompatible types (from closure to logical) in subassignment type fix 

Так что положите его на меня. Какое смехотворно простое решение, которое не появилось, когда я ошибался, пытаясь использовать комбинации ddply и table 948506? Спасибо.

+0

Вы просто хотите подсчет? как насчет 'length (samp $ rating == 'good')' – rawr

+0

@rawr Эта команда вернет длину логического вектора и не засчитает 'TRUE'. –

+0

означает sum, d'oh – rawr

ответ

2

Просто удалите все экземпляры samp$ внутри ddply и он будет работать:

ddply(samp,c("col1","col2"), summarize, 
    good=table(rating)["good"], 
    medium=table(rating)["medium"], 
    bad=table(rating)["bad"]) 
+0

Argh, я могу поклясться, что пробовал, но да, это так просто. Спасибо, что поняли! – rschwieb

1

Общие данные:

samp <- data.frame(rating=c("bad","medium","good","bad","medium","good"), 
        col1=c(2007,2010,2007,2009,2010,2010), 
        col2=c("fiction","fiction","fiction","drama","drama","drama")) 

код (вы не должны использовать samp$ до имен столбцов):

ddply(samp,c("col1","col2"), summarize, 
     good=sum(rating == "good"), 
     medium=sum(rating == "medium"), 
     bad=sum(rating == "bad")) 

Выход:

col1 col2 good medium bad 
1 2007 fiction 1  0 1 
2 2009 drama 0  0 1 
3 2010 drama 1  1 0 
4 2010 fiction 0  1 0 
+0

Sven получает чек для фиксации моего немого стола(), но я хотел бы поблагодарить вас за новую версию. Мне нравится результат немного лучше, и я, вероятно, применил бы этот подход. Большое спасибо! – rschwieb

Смежные вопросы