R语言如何通过变量/字符串访问dataframe指定列
报错原因
R语言中$取子集操作符采用非标准求值逻辑,不会对$后方的标识符做变量解析,只会直接将输入的字面内容作为列名匹配。你写df$x时,R会直接查找df中名为x的列,完全不会读取全局环境中变量x存储的"a"这个字符串值,因此触发找不到列的报错。
可用解决方法
- 基础R环境下优先用
[[双中括号取子集,该操作符支持传入存储列名的变量做标准求值:
df <- data.frame(a=(1:3), b=c("a", "b", "c")) x <- "a" # 正确返回a列的向量,等价于df[["a"]] df[[x]]
如果需要返回dataframe格式的单列、或者同时选取多列,可以用单中括号的行列索引语法:
# 取a列,返回dataframe格式 df[, x] # 同时取a、b两列 cols <- c("a", "b") df[, cols]
- 如果使用tidyverse生态的dplyr做数据处理,动态传入列名可以用.data代词搭配双中括号,或者将字符串转成符号后解引用:
library(dplyr) # 用.data代词索引,适合直接传字符串变量的场景 df %>% select(.data[[x]]) df %>% pull(.data[[x]]) # 字符串转符号后解引用 df %>% pull(!!sym(x))
注意:不要使用
attach()、eval(parse())这类写法动态取列,极易引发环境冲突、取值错误等不可预期的问题。
内容的提问来源于stack exchange,提问作者Marcel Braasch
相关产品推荐
相关产品推荐

