我有一个从现有data.table中获取某些列作为输入,对其进行计算,然后将结果作为五个新列输出的函数。
我想将五个新列附加到现有的data.table上,但是在不命名列的情况下找不到合适的方法(这似乎是多余的,因为这些列已经在函数的输出中进行了命名,已经输出了一个数据表。
注意:我的实函数没有向量化,所以我必须使用'by'参数。
另外,我的真实函数是另一个函数的包装器,该函数产生模型输出,因此我已将该输出转换为带有as.data.table(pixiedust::dust(...))
的表,因此不必多次运行它即可获取输出的每个元素。
这里是一个玩具示例:
# Load data.table:
library(data.table)
# Create data.table with example data:
mydt <- data.table(region = c("a", "b", "c"),
count = c(0,50,200),
pop = c(1000, 10000, 20000))
# Toy function:
rate <- function(count, pop, denom){
dt = data.table(rawrate = count/pop,
rateperpop = (count/pop)*denom)
return(dt)
}
# Apply the function to mydt:
mydt[, rate(count = count, pop = pop, denom = 100000), by = 1:nrow(mydt)]
# which gives:
nrow rawrate rateperpop
1: 1 0.000 0
2: 2 0.005 500
3: 3 0.010 1000
在上面的示例中,计算了新列,但未将它们添加到mydt
中,后者保持不变。我尝试了链接:
mydt[][, rate(count = count, pop = pop, denom = 100000), by = 1:nrow(mydt)]
...但这也不添加列。
如果我尝试:
mydt[, .(rate(count = count, pop = pop, denom = 100000)), by = 1:nrow(mydt)]
由于by
子句而出现错误,甚至将其删除(我无法使用我的实函数执行此操作)也只会输出新变量,它不会将它们添加到现有的data.table中。
我确信必须有一种语法上简洁的方法来执行此操作,但无法弄清楚-任何解决方案将不胜感激。
一个选项是创建一个临时对象,然后在LHS上将:=
与names
的输出一起使用
new <- mydt[, rate(count = count, pop = pop, denom = 100000)]
mydt[, names(new) := new]
另一个选择是更改功能,以便它修改data.table本身
rate <- function(dt, count, pop, denom){
dt[, `:=`(rawrate = count/pop,
rateperpop = (count/pop)*denom)]
}
mydt
# region count pop
# 1: a 0 1000
# 2: b 50 10000
# 3: c 200 20000
rate(mydt, count = count, pop = pop, denom = 100000)
mydt
# region count pop rawrate rateperpop
# 1: a 0 1000 0.000 0
# 2: b 50 10000 0.005 500
# 3: c 200 20000 0.010 1000