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

3
我是一位有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

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

我有一个类似这样的数据框:

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 

我想创建一个新的数据框,包含:

  • 唯一的ID(使用group_by()实现);
  • 其他列(除了Time列)求和;
  • 保留第一个Time值。

所以结果应该是这样的:

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 

我尝试了这个:
data %>% group_by(ID) %>% summarise_at(vars(-Time), funs(sum.,na.rm = TRUE)))

但是,我的问题在于:变量Time现在已经不在我的数据中了,我无法再添加该变量(因为它的长度已经不同了)。

谢谢,但问题就在这里:我不知道从哪里开始,因为我不知道可能的解决方案是什么。 - R overflow
1个回答

6
我们可以使用 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"))]

使用 dplyr,可以通过按 'ID' 分组,将 'Time' 也添加到分组变量中,通过获取 'Time' 的 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接