gpt4 book ai didi

r - data.table:使用 colnames 通过引用赋值

转载 作者:行者123 更新时间:2023-12-05 07:46:30 24 4
gpt4 key购买 nike

我想在 data.table 中使用列名通过引用 (:=) 进行赋值。调用的函数正在对几列的每行进行一些计算。我使用的是当前开发版本的 data.table (v1.9.7),这使得参数“with=TRUE”变得不必要了。

一个带有显式变量名的最小运行示例是:

DT <- data.table(a = 1:10, b = seq(2, 20, 2), c = seq(5, 50, 5))
DT[, out := sum(a, b), by = 1:nrow(DT)]

但是如果我有很多列并且我使用包含(选定的)列名称的单个变量调用该函数,代码将失败:

DT  <- data.table(a = 1:10, b = seq(2, 20, 2))
col <- colnames(DT)
DT[, out := sum(col), by = 1:nrow(DT)]

编辑:

David Arenburg 的回答 DT[, out := Reduce(+, .SD), .SDcols = col] 适用于这种特定情况。但我真的不明白如何将这种方法应用于另一个函数调用。我写了下面的函数来测试:

myfun <- function(x, y, ...){
in.tmp1 <- x
in.tmp2 <- c(y, ...)
out.tmp <- in.tmp1 + mean(in.tmp2)
return(out.tmp)
}

同样,显式编写列名称的方法如下:

DT <- data.table(a = 1:10, b = seq(2, 20, 2), c = seq(5, 50, 5))
DT[, out := myfun(a,b,c), by = 1:nrow(DT)]

但我无法针对列名指定的 data.table 中的大型子集制定更通用的解决方案。

最佳答案

考虑以下几点:

library("data.table")

dt <- data.table(a = 1:5, b = 5:1, c = 1, d = 2, e = 5:1)


myfun <- function(x, y, ...){
in.tmp1 <- x
in.tmp2 <- c(y, ...)
out.tmp <- in.tmp1 + mean(in.tmp2)
return(out.tmp)
}

my_vars <- c("a", "c", "d")

var_list <- mget(my_vars, envir = as.environment(dt))

names(var_list)[1:2] <- c("x", "y")

dt[, "out" := do.call(myfun, var_list)]

在这里,我们将 my_vars 中的任意一组列收集到 var_listdt 中相应列的非复制别名列表.可以使用 do.call 在 R 中将列作为函数的参数传递,但参数列表(此处为 var_list)中的元素名称必须与函数参数的名称(myfun 具有参数“x”、“y”和“...”,但最后一个参数采用任何名称的元素)。

如果你想更多地使用data.table而不是使用mget,试试

## so myfun finds the correct columns for args "x" and "y"
setnames(dt, c("a", "c"), c("x", "y"))

my_vars <- c("x", "y", "d")
dt[, "out" := do.call(myfun, .SD), .SDcols = my_vars]

编辑 2017-02-22:do.call 中也允许使用未命名的列。

dt[, "out" := do.call(myfun, unname(as.list(.SD))), .SDcols = my_vars]

关于r - data.table:使用 colnames 通过引用赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40766292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com