用户使用 dplyr 折叠行

Collapsing rows by user with dplyr

我想折叠基于用户的行,同时将“1”放在相应的列上。

每个用户的每一行只能有一个“1”,因此无需向后续行添加任何内容。

我的 df:

User  +1  +2  +3  +4  +5
   A   1   0   0   0   0
   A   0   1   0   0   0
   A   0   0   0   0   1
   B   0   0   1   0   0 
   B   0   0   0   1   0

预期结果:

User  +1  +2  +3  +4  +5
   A   1   1   0   0   1
   B   0   0   1   1   0 

如有任何帮助,我们将不胜感激。

看起来你可以使用 summarise_each:

df %>% group_by(User) %>% summarise_all(funs(sum))

编辑说明:用 summarise_all

替换了现已弃用的 summarise_each

这是备用 dplyr 解决方案

df %>% group_by(User) %>% do(as.list(colSums(.)))

data.table 可能的实施方式

library(data.table)
setDT(df)[, lapply(.SD, sum), User]

setDT(df)[, as.list(colSums(.SD)), User]

或者使用 base R,更简单

aggregate(. ~ User, df, sum)

我采用的方法是先将您的数据转换为长格式,然后进行聚合,然后在必要时转换回宽格式以便显示。

因此,使用 tidyr

df %>% gather(rating, count, -User) %>%
  group_by(User, rating) %>%
  summarise(count = max(count)) %>% 
  spread(rating, count)

第一个收集转换为长格式(使用 p 而不是 +):

> df <- read.table(header=TRUE, text='User  p1  p2  p3  p4  p5
   A   1   0   0   0   0
   A   0   1   0   0   0
   A   0   0   0   0   1
   B   0   0   1   0   0 
   B   0   0   0   1   0
')
> df %>% gather(rating, count, -User)
   User rating count
1     A     p1     1
2     A     p1     0
3     A     p1     0
4     B     p1     0
5     B     p1     0
6     A     p2     0
...

其余步骤执行聚合,然后转换回宽格式。