我正在使用聚合函数来聚合我的数据集子集的结果。我希望最终结果替换为原始行(聚合的引用行)。我怎样才能做到这一点?以下是一个示例数据:
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
由于
答案 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
unique
和data.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