r - [R] 中的条件分组和汇总数据框

标签 r dplyr

我有一个这样的数据框:

df <- data.frame(ID = c("A", "A", "B", "B", "C", "C"), 
                 time = c(3.1,3.2,6.5,12.3, 3.2, 3.4), 
                 intensity = c(10, 20, 30, 40, 50, 60))
|ID | time| intensity|
|:--|----:|---------:|
|A  |  3.1|        10|
|A  |  3.2|        20|
|B  |  6.5|        30|
|B  | 12.3|        40|
|C  |  3.2|        50|
|C  |  3.4|        60|

I would like to aggregate values (sum intensities) by ID only when time difference is less than, i.e. 0.3. First I calculated this time difference:

df.2 <- df %>% 
        group_by(ID) %>% 
        mutate(time.diff = max(time) - min(time)) 

...导致:

|身份证 |时间|强度|时间.diff|
|:--|----:|---------:|---------:|
|A | 3.1| 10| 0.1|
|A | 3.2| 20| 0.1|
|乙 | 6.5| 30| 5.8|
|乙 | 12.3| 40| 5.8|
|C | 3.2| 50| 0.2|
|C | 3.4| 60| 0.2|

为了清楚起见,我想得到的输出是:

|身份证 |时间|强度|时间.diff|
|:--|----:|---------:|---------:|
|A | 3.15| 30| 0.1|
|乙 | 6.5| 30| 5.8|
|乙 | 12.3| 40| 5.8|
|C | 3.3| 110| 0.2|

其中时间现在是综合观察的平均值,强度是它们的总和。 ID“B”保留两个观测值,因为它的时间差大于 0.3。我已经尝试过 dplyr,但是summary 总是会丢弃“B”的一个观察值,我想保留它们,我不知道如何做一个有条件的_group_by_。

我感谢你的任何想法!!

最佳答案

data.table 的可能选项

library(data.table)
unique(setDT(df)[, time.diff := max(time)-min(time), ID][
   time.diff <= 0.3, c('time', 'intensity') := list(mean(time),
        sum(intensity)), ID]) 
#    ID  time intensity time.diff
#1:  A  3.15        30       0.1
#2:  B  6.50        30       5.8
#3:  B 12.30        40       5.8
#4:  C  3.30       110       0.2

或使用 dplyr
library(dplyr)
df %>% 
   group_by(ID) %>%
   mutate(time.diff=max(time)-min(time), indx=all(time.diff<=0.3),
         intensity=ifelse(indx, sum(intensity), intensity),
         time=ifelse(indx, mean(time), time)) %>% 
   filter(!indx|row_number()==1) %>%
   select(-indx)
 #  ID  time intensity time.diff
 #1  A  3.15        30       0.1
 #2  B  6.50        30       5.8
 #3  B 12.30        40       5.8
 #4  C  3.30       110       0.2

关于r - [R] 中的条件分组和汇总数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30487714/

相关文章:

r - 有关如何使用 for 循环比较列和向量输入的建议

r - 在R中如何合并列表

r - 过滤掉 R 中特定样本对中存在的观察结果

r - R 和 RcppArmadillo 中的 OpenMP 支持

r - 求加权比例的标准误差(调查数据)

r - pandas 中的向量化按列正则表达式匹配

r - 如何在ggplot2中绘制两条线

r - 如何安装多个包?

r - 如何在不求值的情况下在 dplyr select 中传递列名

r - 与其他加载的包相比,更喜欢 tidyverse 中的函数