为什么 R 无法识别列表中的数据框列名称?

Why won't R recognize data frame column names within lists?

HEADLINE:有没有办法让 R 以识别自由浮动向量的相同方式识别列表中包含的 data.frame 列名称?

SETUP:假设我有一个名为 varA:

的向量
(varA <- 1:6)
# [1] 1 2 3 4 5 6

要获得 varA 的长度,我可以这样做:

length(varA)
#[1] 6

如果变量包含在更大的列表中,仍然可以通过以下方式找到变量及其长度:

list <- list(vars = "varA")
length(get(list$vars[1]))
#[1] 6

问题: 当我用向量替换数据框列时情况并非如此,我不知道如何解决这个问题:

rows <- 1:6
cols <- c("colA")
(df <- data.frame(matrix(NA, 
                         nrow = length(rows), 
                         ncol = length(cols), 
                         dimnames = list(rows, cols))))
#   colA
# 1   NA
# 2   NA
# 3   NA
# 4   NA
# 5   NA
# 6   NA

list <- list(vars = "varA", 
             cols = "df$colA")
length(get(list$vars[1]))
#[1] 6
length(get(list$cols[1]))
#Error in get(list$cols[1]) : object 'df$colA' not found

虽然这个人为的例子看起来很空洞,因为我总是可以使用简单的 length(variable) 方法,但我实际上有兴趣将来自数百个长度不同的变量的数据写入相应的数据框列,并因此保留它们在我可以遍历的列表中将非常有帮助。我已经尝试了所有我能想到的方法,但在 R 中可能是不可能的,尤其是考虑到我找不到任何解决该问题的帖子。

你可以试试:

> length(eval(parse(text = list$cols[1])))
[1] 6

或者:

list <- list(vars = "varA", 
             cols = "colA")

length(df[, list$cols[1]])
[1] 6

或使用正则表达式:

list <- list(vars = "varA", 
             cols = "df$colA")
length(df[, sub(".*\$", "", list$cols[1])])
[1] 6

如果您真正使用的是数据框 d,那么 nrow(d) 就是 d 中所有变量的长度。在这种情况下应该没有理由使用 length

如果您实际使用的列表 x 包含可能不同长度的变量,那么您应该使用 [[ 运算符按名称提取这些变量(参见 ?Extract) :

x <- list(a = 1:10, b = rnorm(20L))
l <- list(vars = "a")
length(d[[l$vars[1L]]]) # 10

如果你坚持使用 get(你不应该),那么你需要提供第二个参数告诉它在哪里寻找变量(参见 ?get):

length(get(l$vars[1L], x)) # 10