使用dplyr按用户折叠行
我想根据用户折叠行,同时将“1”放在相应的列上 每个用户的每一行只能有一个“1”,因此不需要向以下行添加任何内容 我的df:使用dplyr按用户折叠行,r,dplyr,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
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
任何帮助都将不胜感激 看起来您可以使用
对每个人进行总结
:
df %>% group_by(User) %>% summarise_all(funs(sum))
编辑说明:替换了
summary\u each
,现在已被弃用为summary\u all
这里是可选的dplyr
解决方案
df %>% group_by(User) %>% do(as.list(colSums(.)))
或
数据表
可能的实现
library(data.table)
setDT(df)[, lapply(.SD, sum), 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%>%gather(评级、计数,-用户)
用户评级计数
1 A p1 1
2 A p1 0
3 A p1 0
4b p10
5b p10
6a p20
...
剩下的步骤执行聚合,然后转换回宽格式。真不敢相信我不知道每个步骤的摘要。非常感谢你<在dplyr中,code>summary_each已停止,也许可以将答案更改为
summary_all()
?
df %>% gather(rating, count, -User) %>%
group_by(User, rating) %>%
summarise(count = max(count)) %>%
spread(rating, count)
> 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
...