Функция get в R не возвращает существующий объект - PullRequest
0 голосов
/ 06 июня 2019

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

Взяв этот пример фрейма данных:

x <- data.frame(id= c("a", "b", "c"), term= c(179, 182, 179), col1= c(1, 2, 3), col2 = c(4, 5, 6))

Теперь, скажем, я поместил имена переменных из двух столбцов в вектор

vars <- c("x$col1", "x$col2")

Затем, когда я позвоню, получимvars, я хочу, чтобы он возвращал соответствующие значения, например, get (vars [2]) в идеале должен возвращать x $ col2.

Однако я получаю следующую ошибку при попытке запустить get (vars [2])

> get(vars[2])
Error in get(vars[2]) : object 'x$col2' not found

Но когда я просто запускаю x $ col2, проблем нет, и я получаю ожидаемый результат:

> x$col2
[1] 4 5 6

Очевидно, что объект x $ col2 существует.

Что я здесь не так делаю?

1 Ответ

4 голосов
/ 06 июня 2019

Это связано с тем, что get() ожидает имя переменной и x$col2 не является именем переменной в R. x является переменной, $ является функцией и col2 является параметром этой функции. Это просто как запрос get("mean(1:3)"), который не имеет смысла, потому что это значение не является переменной. Таким образом, сообщение об ошибке верно, x$col2 не является объектом, но x является объектом с именованным элементом col2. Вместо того, чтобы извлекать переменную, вам нужно выполнить ту команду, которую вы сохранили в строке.

У вас есть несколько вариантов. Если вы хотите выполнить строку как код, вы можете сделать

eval(parse(text="x$col1"))

Хотя обычно это не рекомендуется , потому что в этих строках могут быть опасные вещи.

Вы можете просто сохранить имена столбцов

vars <- c("col1", "col2")
x[[vars[2]]]

или вы можете использовать get() для data.frame и строки для столбцов

mydata <- "x"
vars <- c("col1", "col2")
get(mydata)[[vars[2]]]

Но, возможно, было бы еще лучше сделать шаг назад, чтобы увидеть, как вы попали в этот момент. Это не тот тип вещей, который вам часто нужно делать при использовании R в R-стиле. Однако вы не представили много контекста о том, что вы действительно пытаетесь достичь, поэтому нелегко предложить альтернативную стратегию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...