我有一个函数,将现有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中。
我确定必须有一种语法上简洁的方法来执行此操作,但无法弄清楚-任何解决方案将不胜感激。
答案 0 :(得分:2)
一种选择是创建一个临时对象,然后在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