聚合函数 - 将 NA 保留在 data.frame

Aggregate Function - Keep NAs in data.frame

我想使用 R 的聚合函数在多个字段上聚合价格。但是,我的数据中也有 NA,我想保留它们。

尝试过:

> dput(df)
structure(list(ID = c(1L, 2L, 3L, 4L, 4L, 1L, 2L, 3L, 4L, 1L, 
2L, 3L, 4L, 3L, 2L, 1L), REFERENCE = c("TEST1", "TEST2", "TEST3", 
"TEST4", "TEST1", "TEST2", "TEST3", "TEST4", "TEST1", "TEST2", 
"TEST3", "TEST4", "TEST1", "TEST2", "", "TEST2"), ISS = c(1234L, 
1234L, 1111L, 1111L, 1234L, 1111L, 1234L, 1111L, 1234L, NA, 1234L, 
1111L, 1234L, 1111L, 1234L, NA), Price = c(10L, NA, 20L, NA, 
10L, 12L, NA, 99L, 100L, NA, 100L, 12L, NA, 11L, 0L, 12L)), .Names = c("ID", 
"REFERENCE", "ISS", "Price"), row.names = c(NA, -16L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x0000000000100788>)
> 
> df <- aggregate(df$Price, by=list(ID=df$ID, REFERENCE=df$REFERENCE, ISS=df$ISS), FUN=sum)

设置na.action = na.pass,得到me:7

Error in aggregate.data.frame(as.data.frame(x), ...) : 
  no rows to aggregate

因此我想要:

因此,我想将我的 NA 数据保存在我的 df 中。

有什么实施建议吗?

感谢您的回复!

我们可以使用 data.table 方法,而不是在 "data.table" 上使用 aggregate。在按 "ID/REFERENCE/ISS" (by=list(ID, REFERENCE, ISS)] 分组后,我们得到价格 (sum(Price, na.rm=TRUE)) 的 sum。按 "ID"、"REFERENCE" 对输出进行排序(如果需要)

 library(data.table)
 df[, sum(Price, na.rm=TRUE), by = list(ID, REFERENCE, ISS)][
                                     order(ID, REFERENCE)]
 #   ID REFERENCE  ISS  V1
 #1:  1     TEST1 1234  10
 #2:  1     TEST2 1111  12
 #3:  1     TEST2   NA  12
 #4:  2           1234   0
 #5:  2     TEST2 1234   0
 #6:  2     TEST3 1234 100
 #7:  3     TEST2 1111  11
 #8:  3     TEST3 1111  20
 #9:  3     TEST4 1111 111
 #10:  4     TEST1 1234 110
 #11:  4     TEST4 1111   0