我想使一个函数返回数据帧的特定列,因为我有几个数据帧,它们的名称仅相差一位数字。例如,我有:
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中的错误: $运算符对原子向量无效
这当然是一个简单的问题,但是我该怎么办呢?
答案 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