我希望在放置' 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
任何帮助将不胜感激。
答案 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
...
其余步骤执行聚合,然后转换回宽格式。