对R数据集中的列求和

时间:2016-11-18 03:56:54

标签: r

我有一个数据集,我想根据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中实现这一目标?我事先道歉,因为我不知道这种技术的术语。

感谢。

3 个答案:

答案 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))