代码之家  ›  专栏  ›  技术社区  ›  denis

.n在data.table中工作不正常。

  •  1
  • denis  · 技术社区  · 8 年前

    我发现了一个令人惊讶的结果 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 on时的语法 .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 回复  |  直到 8 年前
        1
  •  2
  •   dww Jarretinha    8 年前

    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]