如何使用对象调用以数字为列名的R数据框列?
问题:使用变量指代数字列名提取数据
我有一份列名为数字的数据集,示例代码如下:
df<- data.frame(firstvar = c(1:5), secondvar = c(15:19)) colnames (df) <- c(1000, 1500) df # 输出结果: # 1000 1500 # 1 1 15 # 2 2 16 # 3 3 17 # 4 4 18 # 5 5 19
我知道可以用反引号直接调用这类列:
df$`1000` # 输出结果: # [1] 1 2 3 4 5
现在我希望用对象N(实际会作为函数参数)来指代数字列名,替代手动输入1000,但尝试以下方法都返回NULL:
N <- 1000 df$`N` df$N df$'N'
期望实现的效果是:
N <- 1000 df$`N` # [1] 1 2 3 4 5
请问这是否可行?
解决方案
当然可行,但不能用$的方式直接处理,因为$的语法会把后面的内容当作字面量解析,而不是变量。你可以用以下几种方法实现:
使用方括号
[]索引
这是最直接的方式,把变量N转为字符串后传入方括号:N <- 1000 df[[as.character(N)]] # 输出结果: # [1] 1 2 3 4 5如果变量
N本身就是字符串类型(比如N <- "1000"),可以直接用df[[N]]。使用
dplyr的pull()函数(适合tidyverse风格)
如果用tidyverse工具链,可以用pull()结合.data代词:library(dplyr) N <- 1000 df %>% pull(.data[[as.character(N)]]) # 输出结果: # [1] 1 2 3 4 5
核心原因是:$运算符是非标准求值的,它会直接把后面的符号当作列名的字面量,而不会去解析变量的值。而方括号[[是标准求值的,会先计算括号内的表达式,再用结果作为列名去索引。
内容的提问来源于stack exchange,提问作者Luigi
相关产品推荐
相关产品推荐

