2013-06-12 22 views
21

Zastanawiam się, jak korzystać z funkcji subset, jeśli nie znam nazwy kolumny, którą chcę przetestować. Scenariusz jest następujący: Mam aplikację Shiny, w której użytkownik może wybrać zmienną, w której ma filtrować (podzbiór) tabelę danych. Otrzymuję nazwę kolumny z webapp jako wejście, a ja chcę do podzbioru na podstawie wartości tej kolumny, tak jak poniżej:Podzbiór na podstawie zmiennej nazwa kolumny

subset(myData, THECOLUMN == someValue) 

wyjątkiem sytuacji, gdy zarówno THECOLUMN i someValue są zmienne. Czy istnieje składnia służąca do podania pożądanej nazwy kolumny jako ciągu znaków?

Wygląda na to, że chcemy mieć bareword będący nazwą kolumny, a nie zmienną zawierającą nazwę kolumny.

Odpowiedz

20

To właśnie dlatego subset jest złym narzędziem do niczego innego niż interaktywnej użytku:

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

Zasadniczo wydobywające rzeczy w R jest zbudowany wokół [. Użyj tego.

+0

Wygląda na to, że robi to, co chcę, ale jeszcze go nie zweryfikowałem. Zaznaczę to jako odpowiedź i kontynuuję, jeśli mam problemy. – adv12

+0

Ryzykując głupie, czy to się różni, jeśli korzystam z data.table, a nie data.frame? Wygląda na. Przy pomocy data.table mogę użyć "d [d [, theColumnName] ==" c ',] ", ale wydaje mi się, że nie mogę używać" d [d, "nazwaKolumny"] ==' c ",]". – adv12

+0

@ adv12 Nie, 'data.table' działa inaczej i (IMHO) niewiarygodnie tępo (ku mojej ogromnej i powtarzającej się frustracji). Chcę powiedzieć, że plik data.table musi być tak ustawiony, aby to zrobić: 'setkey (d," x "); d ["c"] '. Ale zawsze znajdowałem dane.składnia tabeli tak nieprzejrzysta, że ​​zwykle kończę na "prostszych" metodach. – joran

21

Zarówno subset, jak i with są przeznaczone do użytku interaktywnego, a na ich stronach pomocy znajdują się ostrzeżenia przed ich użyciem w innych funkcjach. Wynika to z ich strategii argumentów ewaluacyjnych jako wyrażeń w środowisku zbudowanym z nazw ich argumentów danych. Te nazwy kolumn/elementów w przeciwnym razie nie byłyby "obiektami" w rozumieniu R.

Jeśli THECOLUMN to nazwa obiektu, którego wartość jest nazwą kolumny i someValue to nazwa obiektu, którego wartość jest celem, to należy użyć:

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

fakt, że " [["oceni swój argument, dlaczego jest lepszy od" $ "do programowania. Jeśli użyjemy przykład Jøran za:

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

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

więc w tym przypadku wszystkie te zwracają ten sam wektor atomowy:

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

Myślę, że można użyć następującego jedno-liner:

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

gdzie

colnames(myData) 

wyprowadza wektor c ontaining wszystkie nazwy kolumn i

grep(someValue, colnames(myData)) 

powinna wyniki w numerycznej wektora o długości 1 (podana nazwa kolumny jest niepowtarzalny), wskazujący na kolumnie. Zobacz ?grep, aby uzyskać informacje o dopasowywaniu wzorców w R.

Powiązane problemy