2013-06-12 2 views
21

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

subset(myData, THECOLUMN == someValue) 

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

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

ответ

20

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

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

Фундаментально, добывающие вещи в R строится вокруг [. Используй это.

+0

Похоже, он делает то, что я хочу, но я еще не проверял его. Я отмечу это как ответ и последую, если у меня возникнут проблемы. – adv12

+0

С риском звучать глупо, отличается ли это, если я использую data.table, а не data.frame? Кажется. С помощью data.table я могу использовать «d [d [, theColumnName] == 'c',]", но, похоже, я не могу использовать "d [d," theColumnName "] == 'c »]». – adv12

+0

@ adv12 Нет, 'data.table' работает по-разному и (IMHO) невероятно тупо (к моим огромным и неоднократным разочарованиям). Я думаю, что для таблицы данных необходимо ввести ключ: «setkey (d,« x »); д [ "с"] '. Но я всегда находил данные.синтаксис таблицы настолько непрозрачен, что я обычно заканчиваю просмотр «более простых» методов. – joran

21

Оба 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) 

выводит вектор c ontaining всех имен столбцов и

grep(someValue, colnames(myData)) 

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