2017-02-07 7 views
1

С кадра данных, как показано нижеR - совокупности с формулой

set.seed(100) 
dfm <- data.frame(
id=sample(1:100, 6, replace = TRUE), 
val1 = rep(c("true", "false"), 3), 
val2=sample(c("true", "false"), 6, replace = TRUE)) 

    id val1 val2 
1 31 true false 
2 26 false true 
3 56 true false 
4 6 false true 
5 47 true false 
6 49 false false 

нужно объединить по id, так что результат имеет вхождения в trueid. Поэтому я пробую следующее:

> aggregate(. ~ id, dfm, function(x) { length(x[x == "true"])}) 

    id val1 val2 
1 6 0 0 
2 26 0 0 
3 31 0 0 
4 47 0 0 
5 49 0 0 
6 56 0 0 
> 

Однако это не возвращает счетчик «истина» для каждого столбца.

ответ

1

Мы можем использовать rowsum

rowsum(+(dfm[-1]=="true"), dfm$id) 

Относительно того, почему код в OP является не работает, это из-за колонн factor 'VAL'. Используйте stringsAsFactors=FALSE в создании «dfm», и код OP должен работать. Когда столбцы factor, то aggregate получает режим integer хранения вместо «верно/неверно» значений, в результате всех 0.

dfm <- data.frame(
    id=sample(1:100, 6, replace = TRUE), 
    val1 = rep(c("true", "false"), 3), 
    val2=sample(c("true", "false"), 6, replace = TRUE), stringsAsFactors=FALSE) 

aggregate(. ~ id, dfm, function(x) { length(x[x == "true"])}) 
# id val1 val2 
#1 21 1 0 
#2 29 1 1 
#3 36 0 0 
#4 40 0 0 
#5 67 0 0 
#6 77 1 0 
Смежные вопросы