R data.table 在所有行上应用具有多列输入的函数并获得合理的输出
R data.table apply function with multiple column input over all rows and get reasonable output
我正在尝试将函数应用于 data.table 的所有行,同时使用多列作为输入,输出可能是一行或两行数据。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
如果您想为您的 data.table 创建 4 列,则可以使用类似以下的方法
test_func = function(day){
delta = day - d0
if(delta == 0 ){
rcomb = list(0, 100, 1,0)
} else if(delta != 100 ){
rcomb <- list(c(0,delta), c(100,delta), c(0,1), c(0,0))
}
rcomb
}
att = gg[, test_func(event_date), by=id]
att
我正在尝试将函数应用于 data.table 的所有行,同时使用多列作为输入,输出可能是一行或两行数据。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
如果您想为您的 data.table 创建 4 列,则可以使用类似以下的方法
test_func = function(day){
delta = day - d0
if(delta == 0 ){
rcomb = list(0, 100, 1,0)
} else if(delta != 100 ){
rcomb <- list(c(0,delta), c(100,delta), c(0,1), c(0,0))
}
rcomb
}
att = gg[, test_func(event_date), by=id]
att