我在data.table
时遇到了令人惊讶的结果。这是一个非常简单的例子:
library(data.table)
df <- data.table(x = 1:10)
df[,x[x>3][.N]]
[1] NA
此语法提供NA
,但这项工作:
df[,x[x>3][1]]
[1] 4
当然还有这个
df[,x[.N]]
[1] 10
我知道在这个简单的例子中你可以做到
df[x>3,x[.N]]
但是我想在df[,x[x>3][.N]]
上使用lapply时使用.SD
语法来避免i
选择上的循环,所以类似
df2 <- data.table(x = rep(1:10,2), y = rep(2:11,2),ID = rep(c("A","B"),each = 10))
cols = c("x","y")
df2[,lapply(.SD,function(x){x[x>3][.N]}),.SDcols = cols, by = ID]
但这失败了,就像我的简单例子一样。是因为.N
在这种情况下没有实现,还是我做错了什么?
我的实际工作:
Reduce(merge,lapply(cols,function(col){df2[col>3,setNames(list( get(col)[.N]),col),by = ID]}))
ID x y
1: A 10 11
2: B 10 11
但我对此并不满意,我发现它不太可读。有没有人解释和更好的工作? 谢谢!!
答案 0 :(得分:2)
df[,x[x>3]]
有7个元素。 .N
是10.您正在尝试将矢量子集超出范围。
因此,您可以使用:
访问lapply
中向量的最后一个元素
df2[, lapply(.SD, function(x) tail(x[x>3], 1) ), .SDcols = c('x','y'), by = ID]
或者更适合data.table,我们可以使用
df2[, lapply(.SD, function(x) last(x[x>3]) ), .SDcols = c('x','y'), by = ID]