首页 > 解决方案 > R:动态引用和操作数据框中的变量

问题描述

我正在尝试动态引用数据框中的向量并对其执行操作。我尝试了各种形式的eval,parse等,但它们要么返回我提供的字符串,要么抛出错误。有人有解决方案吗?正如我在下面的伪代码中建议的那样,解决方案大概是用其他一些函数替换 DO_SOMETHING() 。

# Example data
mydat <- data.frame(x = rnorm(10))

# Function to add 5 to specified variable in a data frame
add5 <- function(data, var){
                 var_ref <- paste0("data$", var)
                 out <- DO_SOMETHING(var_ref) + 5
                 return out
        }

add5(mydat,x) // returns a numeric vector value of 5
class(add5(mydat,x)) // numeric

标签: rstringdataframe

解决方案


使用data.table, 取消引用参数名称很容易。如果您开始使用变量名编写函数,我建议您使用data.table(请参阅我写的关于该主题的博客文章)。

使用一个变量,您将使用取消引用get变量名

library(data.table)

data <- data.table(x = rnorm(10))
myvar <- "x"
data[, out := get(myvar) + 5]

data
              x      out
 1: -0.30229987 4.697700
 2:  0.51658585 5.516586
 3:  0.12180432 5.121804
 4:  1.53438805 6.534388
 5:  0.06213513 5.062135
 6:  0.17935070 5.179351
 7:  0.70002065 5.700021
 8:  0.12067590 5.120676
 9: -0.41002931 4.589971
10:  0.45385072 5.453851

请注意,我不需要重新分配结果,因为:=通过引用进行更新。

对于多个变量,您将使用.SD+ lapply。此语法意味着在数据子集(.SD) 上应用某些内容。.SDcols参数用于控制数据子集中考虑的列。

这是一种非常通用的方法,适用于许多情况。

data <- data.table(x = rnorm(10), y = rnorm(10))
data[, c('out1','out2') := lapply(.SD, function(x) return(x + 5)), .SDcols = c("x","y")]
data
              x          y     out1     out2
 1:  0.91187875 -0.2010539 5.911879 4.798946
 2: -0.70906903  0.2074829 4.290931 5.207483
 3: -0.52517961  0.2027444 4.474820 5.202744
 4:  0.09967933 -1.2315601 5.099679 3.768440
 5: -0.40392510 -0.1777705 4.596075 4.822229
 6:  0.65891623  0.2394889 5.658916 5.239489
 7:  0.76275090  1.5695957 5.762751 6.569596
 8: -0.52395704 -0.7083462 4.476043 4.291654
 9:  0.52728890 -1.1308284 5.527289 3.869172
10: -1.00418691 -0.5569468 3.995813 4.443053

我可以将这种方法用于一列(.SDcols = 'x')。


推荐阅读