用 R 中的原始行替换特定行的聚合结果

Replacing aggregate results for specific rows with original rows in R

我正在使用聚合函数来聚合我的数据集子集的结果。我希望将最终结果替换为原始行(聚合的参考行)。我怎样才能做到这一点?这是一个示例数据:

 Day  hour    Case   Time
 Sat  7       2    35
 Sun  8       8    125
 Sun  9       10   145
 Mon  10      15   18
 Mon  11      17   167
 Mon  12      20   220
 Mon  13      25   135
 Mon  14      14   167

我使用以下代码行来汇总 "Sat" 和 "Sun"

的案例和时间值
aggregate(cbind(Case,Time)~Day,data=subset(TestData,Day == 'Sat' |Day == 'Sun' ),sum)

完全正确。但是,我想知道如何用我得到的聚合结果替换示例数据的第 2、3 行和第 4 行。我希望最终结果是这样的:

       Day  hour    Case   Time
 Sat  7       2    35
 Sun  8       18   270
 Mon  10      15   18
 Mon  11      17   167
 Mon  12      20   220
 Mon  13      25   135
 Mon  14      14   167  

谢谢

我们可以使用data.table来做到这一点。我们 select 需要获得 sum 值 ('nm1') 的列。将'data.frame'转换为'data.table'(setDT(df1)),用逻辑条件指定'i'部分排除其他行(Day %in% c('Sat', 'Sun'),使用.SDcols我们 select sum 的列,循环 (lapply) 通过 Subset of Data.Table (.SD),并将输出分配 (:=) 到'nm1' 中的列和 'i' 中指定的行。

library(data.table)
nm1 <- c('Case', 'Time')
setDT(df1)[Day %in% c('Sat', 'Sun'), (nm1) := lapply(.SD, sum),
                        Day, .SDcols=nm1]

如果我们只需要 unique 行,我们可以使用 data.table 中的 uniqueby 选项

unique(df1, by=c('Case', 'Time'))
#   Day hour Case Time
#1: Sat    7    2   35
#2: Sun    8   18  270
#3: Mon   10   15   18
#4: Mon   11   17  167
#5: Mon   12   20  220
#6: Mon   13   25  135
#7: Mon   14   14  167

或者如果我们使用 OP 的 aggregate 代码,我们可以 merge 将 'r1' 与原始数据集 ('df1') 替换 'rows' 使用从 merge 之后的 'NA' 值派生的逻辑索引,对列进行子集化,删除 duplicated 行并获得输出

r1 <- aggregate(cbind(Case,Time)~Day,data=subset(df1,
                Day == 'Sat' |Day == 'Sun' ),sum)

r2 <- merge(df1, r1, by='Day', all.x=TRUE)
r2[indx, c('Case.x', 'Time.x')] <- r2[indx, c('Case.y', 'Time.y')]

我们select只有需要的列

r3 <- r2[1:4]

删除 'Case'、'Time' 列中的重复行

r3[!duplicated(r3[3:4]),]
#   Day hour Case.x Time.x
#1 Mon   10     15     18
#2 Mon   11     17    167
#3 Mon   12     20    220
#4 Mon   13     25    135
#5 Mon   14     14    167
#6 Sat    7      2     35
#7 Sun    8     18    270

数据

df1 <- structure(list(Day = c("Sat", "Sun", "Sun", "Mon", "Mon", "Mon", 
"Mon", "Mon"), hour = 7:14, Case = c(2L, 8L, 10L, 15L, 17L, 20L, 
25L, 14L), Time = c(35L, 125L, 145L, 18L, 167L, 220L, 135L, 167L
)), .Names = c("Day", "hour", "Case", "Time"), class = "data.frame", 
row.names = c(NA, -8L))

建立在你所拥有的基础上

ind<-with(TestData,Day == 'Sat' |Day == 'Sun')
s<-aggregate(.~Day,data=TestData[ind,],sum)
rbind(s,TestData[!ind,])
  Day hour Case Time
1 Sat    7    2   35
2 Sun   17   18  270
4 Mon   10   15   18
5 Mon   11   17  167
6 Mon   12   20  220
7 Mon   13   25  135
8 Mon   14   14  167

但是,根据问题中所需的输出,您可能希望这样做

s$hour<-with(TestData[ind,],hour[!duplicated(Day)])

rbind之前得到第一个hour而不是小时的总和

  Day hour Case Time
1 Sat    7    2   35
2 Sun    8   18  270
4 Mon   10   15   18
5 Mon   11   17  167
6 Mon   12   20  220
7 Mon   13   25  135
8 Mon   14   14  167