R: "оператор $ недопустим для атомных векторов" - PullRequest
0 голосов
/ 04 ноября 2019

Я хотел бы сделать функцию, возвращающую определенный столбец кадра данных, поскольку у меня есть несколько кадров данных, имена которых меняются только на одну цифру. Например, у меня есть:

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 ]

3 голосов
/ 04 ноября 2019

Проблема в том, что 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 голос
/ 04 ноября 2019

Вы также можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...