如何总结r中的人物

时间:2017-03-22 15:22:39

标签: r dplyr

我有一个数据框:

df <- data.frame(id = c("a","a","a","b","b","b"), survey = rep("1a",6), q1 = c(NA,NA,"y","n",NA,NA),q2 = c("y",NA,NA,NA,"y",NA), q3 = c(NA,"n",NA,NA,NA,"y"))

这些是我需要为每个ID和调查折叠为一个的调查数据。我可以靠近:

df %>% group_by(id, survey) %>% summarize_all(toString)
Source: local data frame [2 x 5]
Groups: id [?]

      id survey        q1        q2        q3
    <fctr> <fctr>     <chr>     <chr>     <chr>
1      a     1a NA, NA, y y, NA, NA NA, n, NA
2      b     1a n, NA, NA NA, y, NA NA, NA, y

我真正需要的是:

  id survey q1 q2 q3
1  a     1a  y  y  n
2  b     1a  n  y  y

真实数据框相当大(120万条记录)。

suppress NAs in paste()完全不同。回答我在那里找不到的问题。

2 个答案:

答案 0 :(得分:0)

使用基本命令的解决方案:

for (i in 3:5) {df[,i] <- ifelse(df[,i] == "y", 1, 
                                 ifelse(df[,i] == "n", 0, df[,1]))}
df2 <- data.frame(aggregate(q1 ~ id + survey, df, FUN = sum), 
                  aggregate(q2 ~ id + survey, df, FUN = sum)[3], 
                  aggregate(q3 ~ id + survey, df, FUN = sum)[3])

不确定大df或与dplyr相比有多快。如果您预计某些ID +调查组合的回复丢失,您可能还希望将data.frame()来电替换为merge()

答案 1 :(得分:0)

最简单的解决方案是:

df %>% group_by(id, survey) %>% summarise_all(na.omit)