【发布时间】: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