R:“ $运算符对原子向量无效”

时间:2019-11-04 13:41:47

标签: r

我想使一个函数返回数据帧的特定列,因为我有几个数据帧,它们的名称仅相差一位数字。例如,我有:

mtcars1 <- data.frame(name1 = mtcars[5, 1], name2 = c(1, 8, 2, 9, 9))
mtcars2 <- data.frame(name1 = mtcars[5, 1], name2 = c(1, 8, 3, 9, 9))

foo <- function(i){
  x <- paste0("mtcars", i)$name2
  return(x)
}

foo(1)应该返回1 8 2 9 9,而foo2应该返回1 8 3 9 9

问题是我有错误:

  

paste0(“ mtcars”,i)$ name2中的错误:     $运算符对原子向量无效

这当然是一个简单的问题,但是我该怎么办呢?

2 个答案:

答案 0 :(得分:3)

问题在于paste0("mtcars", i)$name2返回的字符向量不能由$子集。

您可以使用get做您想做的事情:

> mtcars1 <- data.frame(name1 = mtcars[5, 1], name2 = c(1, 8, 2, 9, 9))
> mtcars2 <- data.frame(name1 = mtcars[5, 1], name2 = c(1, 8, 3, 9, 9))
> 
> foo <- function(i){
+   x <- get(paste0("mtcars", i))$name2
+   return(x)
+ }
> foo(1)
[1] 1 8 2 9 9
> foo(2)
[1] 1 8 3 9 9

答案 1 :(得分:1)

您也可以使用eval()

mtcars1 <- data.frame(name1 = mtcars[5, 1], name2 = c(1, 8, 2, 9, 9))
mtcars2 <- data.frame(name1 = mtcars[5, 1], name2 = c(1, 8, 3, 9, 9))

foo <- function(i){
      x <- eval(expr = parse(text=paste0("mtcars", i,"$name2")))
      return(x)
}

#>foo(1)
#[1] 1 8 2 9 9
#>foo(2)
#[1] 1 8 3 9 9