我有一个数据集,我想根据USER_IDs总结所有Action_1和Action_2(最终删除USER_ID中的重复项)
User_ID Action_1 Action_2
user_001 1 1
user_001 1 0
user_001 0 1
user_002 1 1
user_002 0 1
...
结果:
User_ID Action_1 Action_2
user_001 2 2
user_002 1 2
...
有没有办法在R中实现这一目标?我事先道歉,因为我不知道这种技术的术语。
感谢。
答案 0 :(得分:1)
library(data.table)
df = fread("User_ID Action_1 Action_2
user_001 1 1
user_001 1 0
user_001 0 1
user_002 1 1
user_002 0 1")
#incase df was a data.frame in your code then use setDT() to make it data.table, which can help you with speed.
df[,.(Action_1=sum(Action_1), Action_2=sum(Action_2)),"User_ID"]
# User_ID a b
#1: user_001 2 2
#2: user_002 1 2
我有很多列,所有这些都是数字的,你想要总结,然后基于@thelatemail你
dat[, lapply(.SD,sum), by=User_ID]
如果您使用的是几个但不是所有列,则可以将.SD与.SDcols结合使用!
sd.cols = c("Action_1", "Action_2")
dat[, lapply(.SD,sum), by=User_ID, .SDcols = sd.cols]
答案 1 :(得分:0)
这是aggregate
函数的确切用例:
aggregate(df[-1], by = df["User_ID"], FUN = sum)
by
参数是一个因子列表,表示第一个元素中应该应用函数FUN
的组。
或使用公式界面:
aggregate(. ~ User_ID, df, FUN = sum)
答案 2 :(得分:0)
将输入视为:
structure(list(User_Id = structure(c(1L, 1L, 1L, 2L, 2L),
.Label = c("user_001", "user_002"), class = "factor"),
Action_1 = c(1, 1, 0, 1, 0), Action_2 = c(1, 0, 1, 1, 1)),
.Names = c("User_Id", "Action_1", "Action_2"),
row.names = c(NA, -5L), class = "data.frame")
您可以尝试tidyverse
:
df_test %>%
group_by(User_Id) %>%
summarise( Action_1 = sum(Action_1), Action_2 = sum(Action_2))