总结唯一值上的行,时间列除外

R o*_*low 3 r dplyr

我有一个思考问题(不确定堆栈上是否已有解决方案,但我不知道如何解决这个问题).

我有一个这样的数据框:

ID      Visits    Time                      X    Y    Z 
1        2        2016-05-15 06:38:40       1    1    0 
1        4        2016-05-15 07:38:40       0    0    1 
1        2        2016-05-15 08:38:40       0    1    0 
2        3        2016-05-15 09:38:40       1    0    2 
3        2        2016-05-15 10:38:40       0    1    0 
3        1        2016-05-15 11:38:40       1    0    1 
Run Code Online (Sandbox Code Playgroud)

我想制作一个新的数据框,包括:

  • 唯一ID(我想用group_by());
  • 其他列(时间除外)总和;
  • 保持第一次

所以结果应该是这样的:

ID      Visits    Time                      X    Y    Z 
1        8        2016-05-15 06:38:40       1    2    1 
2        3        2016-05-15 09:38:40       1    0    2 
3        3        2016-05-15 10:38:40       1    1    1 
Run Code Online (Sandbox Code Playgroud)

我试过这个:

data %>% group_by(ID) %>% summarise_at(vars(-Time), funs(sum.,na.rm = TRUE)))
Run Code Online (Sandbox Code Playgroud)

但是,有我的想法问题:变量Time现在不在我的数据中,我不能再添加变量了(因为它不再是相同的长度).

akr*_*run 7

我们可以这样做 data.table

library(data.table)
setDT(data)[, c(list(Time = Time[1]), lapply(.SD, sum, na.rm = TRUE)), 
            ID, .SDcols = setdiff(names(data), c("ID", "Time"))]
Run Code Online (Sandbox Code Playgroud)

或者dplyr,在按"ID"分组后,通过取first"时间"然后在分组变量中添加"时间",然后执行summarise_all

data %>% 
     group_by(ID) %>% 
     group_by(Time = first(Time), add = TRUE)  %>% 
     summarise_all(sum, na.rm = TRUE)
# A tibble: 3 x 6
# Groups: ID [?]
#     ID Time                Visits     X     Y     Z
#   <int> <chr>                <int> <int> <int> <int>
#1     1 2016-05-15 06:38:40      8     1     2     1
#2     2 2016-05-15 09:38:40      3     1     0     2
#3     3 2016-05-15 10:38:40      3     1     1     1
Run Code Online (Sandbox Code Playgroud)