.N在data.table

时间:2018-05-29 16:46:26

标签: r data.table

我在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

但我对此并不满意,我发现它不太可读。有没有人解释和更好的工作? 谢谢!!

1 个答案:

答案 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]