用 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
中的 unique
和 by
选项
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
我正在使用聚合函数来聚合我的数据集子集的结果。我希望将最终结果替换为原始行(聚合的参考行)。我怎样才能做到这一点?这是一个示例数据:
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
中的 unique
和 by
选项
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