用户使用 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
...
其余步骤执行聚合,然后转换回宽格式。
我想折叠基于用户的行,同时将“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
...
其余步骤执行聚合,然后转换回宽格式。