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

时间:2015-08-06 14:56:30

标签: r aggregate-functions

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

 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  

由于

2 个答案:

答案 0 :(得分:1)

我们可以使用data.table来执行此操作。我们选择获取sum值所需的列(' nm1')。转换' data.frame'到' data.table' (setDT(df1)),指定' i'部分具有逻辑条件以排除其他行(Day %in% c('Sat', 'Sun'),使用.SDcols我们选择sum的列,循环(lapply)到Subset of Data.Table({ {1}}),并将输出(.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 uniquedata.table选项

by

如果我们使用OP的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 代码,我们可以aggregate&#39; r1&#39;使用原始数据集(&#39; df1&#39;),替换&#39;行&#39;使用来自&#39; NA&#39;的逻辑索引merge之后的值,列的子集,删除merge行并获取输出

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')]

删除&#39;案例&#39;时间&#39;中的重复行柱

r3 <- r2[1:4]

数据

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

答案 1 :(得分:1)

以你拥有的为基础

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