R 当缺少组合时,如何按组计算平均值
我有一个数据集,有两个键(R 当缺少组合时,如何按组计算平均值,r,data.table,R,Data.table,我有一个数据集,有两个键(ID和Cells),用于多个日期。 我想每月计算MM的平均值。问题是一些ID-单元格组合中缺少一些日期,但我可以每天使用一个MM,因此这不是问题 我要做的是创建一个具有唯一日期的新数据表,计算MM的平均值,然后将其与原始数据表合并,然后删除重复的列 这显然是没有效率的。还有别的办法吗 可复制示例: sapply(c('data.table', 'lubridate'), require, character.only = TRUE) DT <- fread('D
ID
和Cells
),用于多个日期。
我想每月计算MM
的平均值。问题是一些ID
-单元格组合中缺少一些日期,但我可以每天使用一个MM
,因此这不是问题
我要做的是创建一个具有唯一日期的新数据表,计算MM
的平均值,然后将其与原始数据表合并,然后删除重复的列
这显然是没有效率的。还有别的办法吗
可复制示例:
sapply(c('data.table', 'lubridate'), require, character.only = TRUE)
DT <- fread('DATE, ID, Cells, MM
2000-01-01, 1, 1, 100
2000-01-02, 1, 2, 200
2000-01-03, 1, 3, 300
2000-01-01, 2, 10, 100
2000-01-02, 2, 20, 200
2000-01-03, 2, 30, 300
2000-01-04, 2, 40, 400
2000-02-01, 1, 1, 500
2000-02-02, 1, 2, 600
2000-02-04, 1, 4, 800
2000-02-01, 2, 10, 500
2000-02-03, 2, 30, 700
2000-02-04, 2, 40, 800')
DT[, date := as.Date(DATE, format = '%Y-%m-%d')]
DT[, c('Year', 'Month', 'Day') := .(year(date),
month(date), day(date))]
setkey(DT, DATE)
DT.MM <- DT[which(!duplicated(DT))]
setkey(DT.MM, DATE)
DT.MM[, AverageMM := mean(MM), by = .(Year, Month)]
DT <- DT[DT.MM]
DT[, c('i.ID', 'i.Cells', 'i.date', 'i.Year', 'i.Month', 'i.Day') := NULL]
# > DT # This is what I want to get back
# DATE ID Cells MM date Year Month Day AverageMM
# 1: 2000-01-01 1 1 100 2000-01-01 2000 1 1 250
# 2: 2000-01-01 2 10 100 2000-01-01 2000 1 1 250
# 3: 2000-01-02 1 2 200 2000-01-02 2000 1 2 250
# 4: 2000-01-02 2 20 200 2000-01-02 2000 1 2 250
# 5: 2000-01-03 1 3 300 2000-01-03 2000 1 3 250
# 6: 2000-01-03 2 30 300 2000-01-03 2000 1 3 250
# 7: 2000-01-04 2 40 400 2000-01-04 2000 1 4 250
# 8: 2000-02-01 1 1 500 2000-02-01 2000 2 1 650
# 9: 2000-02-01 2 10 500 2000-02-01 2000 2 1 650
#10: 2000-02-02 1 2 600 2000-02-02 2000 2 2 650
#11: 2000-02-03 2 30 700 2000-02-03 2000 2 3 650
#12: 2000-02-04 1 4 800 2000-02-04 2000 2 4 650
#13: 2000-02-04 2 40 800 2000-02-04 2000 2 4 650
sapply(c('data.table','lubridate'),require,character.only=TRUE)
DT您可以使用DATE
和ID
上的交叉连接作为i
中的参考,添加缺少的DATE
/ID
组合,然后计算平均值:
DT[CJ(DATE, ID, unique = TRUE), on=c(DATE="V1", ID="V2")
][, AverageMM := sum(MM, na.rm = TRUE)/.N, by = .(year(DATE), month(DATE))][]
其中:
DATE ID Cells MM Year Month Day AverageMM
1: 2000-01-01 1 1 100 2000 1 1 200.0
2: 2000-01-01 2 10 100 2000 1 1 200.0
3: 2000-01-02 1 2 200 2000 1 2 200.0
4: 2000-01-02 2 20 200 2000 1 2 200.0
5: 2000-01-03 1 3 300 2000 1 3 200.0
6: 2000-01-03 2 30 300 2000 1 3 200.0
7: 2000-01-04 1 NA NA NA NA NA 200.0
8: 2000-01-04 2 40 400 2000 1 4 200.0
9: 2000-02-01 1 1 500 2000 2 1 487.5
10: 2000-02-01 2 10 500 2000 2 1 487.5
11: 2000-02-02 1 2 600 2000 2 2 487.5
12: 2000-02-02 2 NA NA NA NA NA 487.5
13: 2000-02-03 1 NA NA NA NA NA 487.5
14: 2000-02-03 2 30 700 2000 2 3 487.5
15: 2000-02-04 1 4 800 2000 2 4 487.5
16: 2000-02-04 2 40 800 2000 2 4 487.5
另一种可能是使用tidyr软件包中的complete
功能添加缺少的DATE
/ID
组合:
这将为您提供相同的输出。您可以使用日期
和ID
上的交叉连接作为i
中的参考,添加缺少的日期
/ID
组合,然后计算平均值:
DT[CJ(DATE, ID, unique = TRUE), on=c(DATE="V1", ID="V2")
][, AverageMM := sum(MM, na.rm = TRUE)/.N, by = .(year(DATE), month(DATE))][]
其中:
DATE ID Cells MM Year Month Day AverageMM
1: 2000-01-01 1 1 100 2000 1 1 200.0
2: 2000-01-01 2 10 100 2000 1 1 200.0
3: 2000-01-02 1 2 200 2000 1 2 200.0
4: 2000-01-02 2 20 200 2000 1 2 200.0
5: 2000-01-03 1 3 300 2000 1 3 200.0
6: 2000-01-03 2 30 300 2000 1 3 200.0
7: 2000-01-04 1 NA NA NA NA NA 200.0
8: 2000-01-04 2 40 400 2000 1 4 200.0
9: 2000-02-01 1 1 500 2000 2 1 487.5
10: 2000-02-01 2 10 500 2000 2 1 487.5
11: 2000-02-02 1 2 600 2000 2 2 487.5
12: 2000-02-02 2 NA NA NA NA NA 487.5
13: 2000-02-03 1 NA NA NA NA NA 487.5
14: 2000-02-03 2 30 700 2000 2 3 487.5
15: 2000-02-04 1 4 800 2000 2 4 487.5
16: 2000-02-04 2 40 800 2000 2 4 487.5
另一种可能是使用tidyr软件包中的complete
功能添加缺少的DATE
/ID
组合:
这将为您提供相同的输出。您可以
DT[, aveMM := weighted.mean(MM, !duplicated(DATE)), by=.(year(DATE), month(DATE))]
给
DATE ID Cells MM AveMM
1: 2000-01-01 1 1 100 250
2: 2000-01-02 1 2 200 250
3: 2000-01-03 1 3 300 250
4: 2000-01-01 2 10 100 250
5: 2000-01-02 2 20 200 250
6: 2000-01-03 2 30 300 250
7: 2000-01-04 2 40 400 250
8: 2000-02-01 1 1 500 650
9: 2000-02-02 1 2 600 650
10: 2000-02-04 1 4 800 650
11: 2000-02-01 2 10 500 650
12: 2000-02-03 2 30 700 650
13: 2000-02-04 2 40 800 650
这将为重复的天数指定零权重
要扩展到mean
以外的函数,可以使用以下方法:
DT[, AveMM := mean(tapply(MM, DATE, head, 1)), by=.(year(DATE), month(DATE))]
然而,它不是很数据。表ish。您可以做
DT[, aveMM := weighted.mean(MM, !duplicated(DATE)), by=.(year(DATE), month(DATE))]
给
DATE ID Cells MM AveMM
1: 2000-01-01 1 1 100 250
2: 2000-01-02 1 2 200 250
3: 2000-01-03 1 3 300 250
4: 2000-01-01 2 10 100 250
5: 2000-01-02 2 20 200 250
6: 2000-01-03 2 30 300 250
7: 2000-01-04 2 40 400 250
8: 2000-02-01 1 1 500 650
9: 2000-02-02 1 2 600 650
10: 2000-02-04 1 4 800 650
11: 2000-02-01 2 10 500 650
12: 2000-02-03 2 30 700 650
13: 2000-02-04 2 40 800 650
这将为重复的天数指定零权重
要扩展到mean
以外的函数,可以使用以下方法:
DT[, AveMM := mean(tapply(MM, DATE, head, 1)), by=.(year(DATE), month(DATE))]
然而,它不是很好的数据。表ish。为什么不干脆DT[,averagem:=mean(MM),(年,月)]
?@Jaap,因为我通过这种方式得到了不同的平均值。例如,我一月份得到的228.57
,而我想得到250。这是因为“你的”平均值(比我想要的更正常)是基于现有的观测值计算的,而我想解释缺失的观测值。也就是说,我想假设MM在某一天存在,如果它缺失的话。你是如何得到250
和650
的值的?请参阅我的答案,以获得考虑到缺失观测值的解决方案。然而,我得到了不同的值。DT.MM你不应该只看缺失的DATE
/ID
组合而不是只看缺失的日期吗?为什么不只看DT[,averagem:=平均值(MM),(年,月)]
?@Jaap,因为我这样得到的平均值不同。例如,我一月份得到的228.57
,而我想得到250。这是因为“你的”平均值(比我想要的更正常)是基于现有的观测值计算的,而我想解释缺失的观测值。也就是说,我想假设MM在某一天存在,如果它缺失的话。你是如何得到250
和650
的值的?请参阅我的答案,以获得考虑到缺失观测值的解决方案。但是,我得到了不同的值。DT.MM您不应该只查看缺少的日期而不是查看缺少的日期吗?