我有一个这样的数据框:
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/