Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 当缺少组合时,如何按组计算平均值_R_Data.table - Fatal编程技术网

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您不应该只查看缺少的日期而不是查看缺少的日期吗?