用户使用dplyr折叠行

时间:2015-02-03 19:00:02

标签: r 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 

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:13)

您似乎可以使用summarise_each

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

答案 1 :(得分:7)

此处有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]

或者使用基础R,甚至更简单

aggregate(. ~ User, df, sum)

答案 2 :(得分:1)

我接近这种方式的方法是首先将数据转换为长格式,然后进行聚合,并在必要时转换回宽格式以用于显示目的。

所以,使用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
...

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