Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr按用户折叠行_R_Dplyr - Fatal编程技术网

使用dplyr按用户折叠行

使用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

我想根据用户折叠行,同时将“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 

任何帮助都将不胜感激

看起来您可以使用
对每个人进行总结

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
...