将功能输出作为新列添加到data.table中,而无需命名它们

问题描述 投票:0回答:1

我有一个从现有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中。

我确信必须有一种语法上简洁的方法来执行此操作,但无法弄清楚-任何解决方案将不胜感激。

r function data.table append multiple-columns
1个回答
1
投票

一个选项是创建一个临时对象,然后在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
© www.soinside.com 2019 - 2024. All rights reserved.