【发布时间】:2015-04-17 17:24:15
【问题描述】:
我正在尝试将函数应用于 data.table 的所有行,同时使用多列作为输入,输出可能是每行的一或两行 data.frame/matrix/what-have-you .我的 data.table 有 800,000 行。
这是我最接近的尝试。在这里发挥作用的当然是输出结构的正确性、效率和易用性。
library(data.table)
d0 = as.Date("2014/01/01")
sdays = seq(d0,d0+99,by=1)
gg=data.table(id=1:100,event_date = sdays)
setkey(gg, id)
test_func = function(id,day){
delta = day - d0
if(delta == 0 ){
rcomb = c(id, 0, 100, 1,0)
} else if(delta != 100 ){
r1 = c(id, 0, delta, 0, 0)
r2 = c(id, delta, 100, 1, 0)
rcomb = rbind(r1,r2)
}
rcomb
}
att = gg[, test_func( get("id"), get("event_date")), by=id]
att
关于如何在这里使用快速 data.table 技巧的任何想法?我已经研究了几个小时,但还没有走得更近:/ 至于输出,我希望它是一个列表,每个原始行有一个条目,这样我就可以调用do.call 和rbind。谢谢!
所以让我举一个期望输出的例子,但是以一种非常低效的方式:
some_list = vector("list", 100)
for(i in 1:100) {
some_list[[i]] <- test_func(gg$id[i], gg$event_date[i])
}
happy=do.call(rbind,some_list)
head(happy)
[,1] [,2] [,3] [,4] [,5]
1 0 100 1 0
r1 2 0 1 0 0
r2 2 1 100 1 0
r1 3 0 2 0 0
r2 3 2 100 1 0
r1 4 0 3 0 0
【问题讨论】:
-
我认为你在这里不需要
get。gg[,test_func(id, event_date), id] -
是的,好点子!但它仍然给出错误的结果:|
-
根据您的示例数据集,预期结果是什么?
-
不完全是.. 如果您查看
head(att,n=20),您会注意到顺序连接每个向量的最后部分的不规则模式。这也是一个问题,因为在数据中无法确定是否会有 1 行或 2 行输出。编辑:回应转置评论
标签: r data.table multiple-columns apply mapply