【问题标题】:R data.table lapply attributing a list type to a columnR data.table lapply 将列表类型归因于列
【发布时间】:2015-04-20 21:44:29
【问题描述】:

这段代码运行良好:

dt <- data.table(c(as.integer(98033),as.integer(980341234),as.integer(98033)),c(1,2,3))
dt[,.(count=.N),by=V1]

我的问题出在这个代码块中:

dt <- dt[,zips:=lapply(V1,fixzip)]
dt[,.(count=.N),by=zips]

哪个抛出

[.data.table(dt, , .(count = .N), by = zips) 中的错误: “by”或“keyby”列表中的项目长度为 (1,1,1)。每个必须与 x 中的行或 i (3) 返回的行数相同。

我认为这与 lapply 分配有关,正如环境浏览器显示的那样

V1 : 整数 98033 980341234 98033

拉链:3 个列表

..$ : int 98033

..$ : int 98034

..$ : int 98033

如何将 lapply 分配的列表更改为普通列?或者,如果有人可以向我指出更好的“R”方式来做到这一点,我们将不胜感激。

如果相关,fixzip 函数如下所示:

fixzip <- function(zip){
  if(is.finite(zip) == 0){
    return(0)
  }
  if(zip < 10000){
    return(0)
  }
  if(zip > 100000){
    return(as.integer(floor(zip/10000)))
  }
  return(zip)
}

【问题讨论】:

  • 只需使用sapply 而不是lapply
  • 如果你只在一个列上使用它,V1,写zip:=fixit(V1)。哦,我明白了,它不是矢量化的。
  • @Alex 自行回答问题,以便将其标记为已回答。

标签: r data.table lapply calculated-columns


【解决方案1】:

使用 sapply() 代替 lapply()。 Sapply 返回向量,而 lapply 返回列表。感谢@David Arenburg。

【讨论】:

    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多