使用ddply基于列合并二进制数据行

时间:2014-09-03 12:36:09

标签: r sum plyr

我有以下数据框,我希望将一行中的二进制值合并到一起。

df =data.frame(ID=c(rep("A",5),rep("B",5)), nr=c(rep("2",5),rep("3",5)), replicate(10,sample(0:1,10,rep=TRUE)))

eg:

# ID nr X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
# A  2  0  0  1  1  1  1  1  1  1   0
# A  2  1  0  0  0  0  0  0  1  0   1
# A  2  0  0  1  1  1  0  0  0  0   1
# A  2  0  0  0  0  0  1  1  1  0   1
# A  2  0  0  0  1  0  1  1  0  1   1
# B  3  0  1  0  0  1  0  0  0  1   1
# B  3  1  1  0  0  0  0  0  0  0   1
# B  3  1  0  1  0  0  0  1  1  0   1
# B  3  1  1  1  0  1  0  0  1  1   1
# B  3  0  0  0  1  0  0  0  1  0   1

现在我想合并前两列的行:

df2 = ddply(df, c(1:2), summarise, numcolwise(sum,c(3:12)))

但是我收到以下错误:

Error in vector(type, length) : 
   vector: cannot make a vector of mode 'closure'.

此外,我希望将高于1的任何内容重置为1以保持二进制,但由于我无法通过错误,我还没有尝试过。

我知道之前已经问过这个问题的变化,但我以前没有发现过这个问题。请记住,我想使用列索引,因为我正在处理大数据。

1 个答案:

答案 0 :(得分:2)

如果您的数据非常大(如评论中所述),请忘记plyr,尝试data.table

library(data.table)
setDT(df)[, lapply(.SD, sum), by = list(ID, nr)]

##    ID nr X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
## 1:  A  2  2  3  5  2  5  2  1  3  4   1
## 2:  B  3  3  3  4  1  3  2  3  2  1   4

或者,如果您想坚持使用plyr家庭,请转到下一代:dplyr

library(dplyr)
df %>%
  group_by(ID, nr) %>%
  summarise_each(funs(sum))

# Source: local data table [2 x 12]
# Groups: ID
# 
#   ID nr X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
# 1  A  2  2  3  5  2  5  2  1  3  4   1
# 2  B  3  3  3  4  1  3  2  3  2  1   4