Подмножество, основанное на имени столбца переменной
Мне интересно, как использовать функцию subset
, если я не знаю имя столбца, который я хочу проверить. Сценарий таков: у меня есть приложение Shiny, в котором пользователь может выбрать переменную, по которой будет фильтроваться (подмножество) таблицы данных. Я получаю имя столбца из webapp как ввод, и я хочу подмножество на основе значения этого столбца, например:
subset(myData, THECOLUMN == someValue)
За исключением тех случаев, когда оба THECOLUMN
и someValue
являются переменными. Есть ли синтаксис для передачи имени нужного столбца в виде строки?
Кажется, нужно, чтобы в качестве имени столбца было только одно слово, а не переменная, содержащая имя столбца.
Ответы
Ответ 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.