data.table 聚合在 NA 方面有问题
data.table aggregation having trouble with NAs
我正在使用 data.table
包将给定位置在每个时间段内具有多个观测值的面板聚合到一个面板中,其中有一个时间段位置的唯一观测值。但是,我无法汇总 NA 的观察结果。虽然这很有效:
set.seed(123)
data.frame(name = c("a", "a", "a", "b", "b", "b"), t = rep(c(1,2),3), x1 = sample(0:10,6), x2 = sample(0:10,6))
f1
name t x1 x2
a 1 3 5
a 2 7 8
a 1 10 4
b 2 9 3
b 1 6 6
b 2 0 2
f2 <- setDT(f1)[, lapply(.SD, sum(x, na.rm = TRUE)), by = .(name,t), .SDcols = c("x1", "x2")]
f2
name t x1 x2
a 1 13 9
a 2 7 8
b 2 9 5
b 1 6 6
添加 NA 会阻止 sum()
工作:
f1[1,3] <- NA
f1
name t x1 x2
a 1 NA 5
a 2 7 8
a 1 10 4
b 2 9 3
b 1 6 6
b 2 0 2
f2 <- setDT(f1)[, lapply(.SD, sum(x, na.rm = TRUE)), by = .(name,t), .SDcols = c("x1", "x2")]
f2
name t x1 x2
a 1 NA 9
a 2 7 8
b 2 9 5
b 1 6 6
而 a, 1 的 x1 值应该是 10。知道为什么即使在 na.rm 参数里面也会发生这种情况吗?谢谢。
这是将括号放在正确位置的问题。您应该使用 lapply(.SD, sum, na.rm = TRUE)
而不是 lapply(.SD, sum(x, na.rm = TRUE))
。使用 lapply
时,您必须在 sum
调用之后添加 sum
函数的额外参数,而不是在 sum
调用内部。此外,您不需要 sum(x)
中的 (x)
部分。因为 lapply
的结构是 lapply(X, FUN, ...)
,所以 FUN
部分中指定的函数自动应用于 X
部分中的变量。
所以,您的代码应该是:
setDT(f1)[, lapply(.SD, sum, na.rm = TRUE), by = .(name,t)]
给出:
name t x1 x2
1: a 1 0 11
2: a 2 5 9
3: b 2 18 12
4: b 1 1 4
注意:我将 .SDcols = c("x1", "x2")
部分排除在代码之外,因为在这种情况下不需要它。包括它会给你相同的结果。
我正在使用 data.table
包将给定位置在每个时间段内具有多个观测值的面板聚合到一个面板中,其中有一个时间段位置的唯一观测值。但是,我无法汇总 NA 的观察结果。虽然这很有效:
set.seed(123)
data.frame(name = c("a", "a", "a", "b", "b", "b"), t = rep(c(1,2),3), x1 = sample(0:10,6), x2 = sample(0:10,6))
f1
name t x1 x2
a 1 3 5
a 2 7 8
a 1 10 4
b 2 9 3
b 1 6 6
b 2 0 2
f2 <- setDT(f1)[, lapply(.SD, sum(x, na.rm = TRUE)), by = .(name,t), .SDcols = c("x1", "x2")]
f2
name t x1 x2
a 1 13 9
a 2 7 8
b 2 9 5
b 1 6 6
添加 NA 会阻止 sum()
工作:
f1[1,3] <- NA
f1
name t x1 x2
a 1 NA 5
a 2 7 8
a 1 10 4
b 2 9 3
b 1 6 6
b 2 0 2
f2 <- setDT(f1)[, lapply(.SD, sum(x, na.rm = TRUE)), by = .(name,t), .SDcols = c("x1", "x2")]
f2
name t x1 x2
a 1 NA 9
a 2 7 8
b 2 9 5
b 1 6 6
而 a, 1 的 x1 值应该是 10。知道为什么即使在 na.rm 参数里面也会发生这种情况吗?谢谢。
这是将括号放在正确位置的问题。您应该使用 lapply(.SD, sum, na.rm = TRUE)
而不是 lapply(.SD, sum(x, na.rm = TRUE))
。使用 lapply
时,您必须在 sum
调用之后添加 sum
函数的额外参数,而不是在 sum
调用内部。此外,您不需要 sum(x)
中的 (x)
部分。因为 lapply
的结构是 lapply(X, FUN, ...)
,所以 FUN
部分中指定的函数自动应用于 X
部分中的变量。
所以,您的代码应该是:
setDT(f1)[, lapply(.SD, sum, na.rm = TRUE), by = .(name,t)]
给出:
name t x1 x2
1: a 1 0 11
2: a 2 5 9
3: b 2 18 12
4: b 1 1 4
注意:我将 .SDcols = c("x1", "x2")
部分排除在代码之外,因为在这种情况下不需要它。包括它会给你相同的结果。