Подтвердить что ты не робот

Подмножество, основанное на имени столбца переменной

Мне интересно, как использовать функцию subset, если я не знаю имя столбца, который я хочу проверить. Сценарий таков: у меня есть приложение Shiny, в котором пользователь может выбрать переменную, по которой будет фильтроваться (подмножество) таблицы данных. Я получаю имя столбца из webapp как ввод, и я хочу подмножество на основе значения этого столбца, например:

subset(myData, THECOLUMN == someValue)

За исключением тех случаев, когда оба THECOLUMN и someValue являются переменными. Есть ли синтаксис для передачи имени нужного столбца в виде строки?

Кажется, нужно, чтобы в качестве имени столбца было только одно слово, а не переменная, содержащая имя столбца.

4b9b3361

Ответ 1

Именно поэтому subset является плохим инструментом для чего угодно, кроме интерактивного использования:

d <- data.frame(x = letters[1:5],y = runif(5))
> d[d[,'x'] == 'c',]
  x         y
3 c 0.3080524

В основном, извлечение вещей в R строится вокруг [. Используйте его.

Ответ 2

Оба subset и with предназначены для интерактивного использования, а предупреждения об их использовании в рамках других функций будут найдены на страницах справки. Это связано с их стратегией аргументов оценки как выражений в среде, построенной из имен их аргументов данных. Эти имена столбцов/элементов в противном случае не были бы "объектами" в R-смысле.

Если THECOLUMN - это имя объекта, значением которого является имя столбца, а someValue - это имя объекта, значение которого является целью, то вы должны использовать:

dfrm[ dfrm[[THECOLUMN]] == someValue , ]

Тот факт, что "[[" будет оценивать свой аргумент, является причиной того, что он превосходит "$" для программирования. Если мы используем пример joran:

 d <- data.frame(x = letters[1:5],y = runif(5))
 THECOLUMN= "x"
 someValue= "c"

d[ d[[THECOLUMN]] == someValue , ]
#   x         y
# 3 c 0.7556127

Итак, в этом случае все они возвращают один и тот же атомный вектор:

d[[ THECOLUMN ]]
d[[ 'x' ]]
d[ , 'x' ]
d[, THECOLUMN ]
d$x  # of the three extraction functions: `$`, `[[`, and `[`,
     # only `$` is unable to evaluate its argument

Ответ 3

Я думаю, вы могли бы использовать следующий однострочный шрифт:

myData[ , grep(someValue, colnames(myData))]

где

colnames(myData)

выводит вектор, содержащий все имена столбцов и

grep(someValue, colnames(myData))

должен привести к числовому вектору длины 1 (если имя столбца уникально), указывающее на ваш столбец. См. ?grep для получения информации о совпадении шаблонов в R.