2015-01-06 30 views
5

Mam tabelę danych z wielu kolumn wygląda tak:Wybór z dplyr parametrami w nazwach kolumn

sd1_scale1 sd1_scale2 sd1_scale3 ... sd2_scale1 sd2_scale2 ... itd

I manipulować te dane i korzystać z dplyr select w ten sposób:

select(code_group, sd1_scale1:sd1_scale13) 

chcę napisać funkcję, która bierze numer (numer sD), a także zaznaczanie kolumn przez to, coś toalecie Król taki jak ten:

makeData <- function(sdNumber) { 

     return select(code_group, sd{sdNumber}_scale1:sd{sdNumber}_scale13) 

    } 

Czy można to zrobić z dplyr? Nie udało mi się przejść do wybranych indeksów kolumn, więc nie mam pojęcia, jak to zrobić. Z góry dziękuję!

+1

użyć 'paste' i' select_'. – Gregor

+0

O ile mi wiadomo, wklej działa do łączenia ciągów w R, a nie znalazłem w help funkcji select_ może być you znaczenie select_vars? I jak przekazać to wyrażenie sd1_scale1: sd1_scale13 do select_vars? –

+1

Upewnij się, że 'dplyr' jest aktualny. 'select _()' jest wersją 'select()', która przyjmuje łańcuchy jako argumenty. Większość każdej funkcji 'dplyr' ma wersję kończącą się znakiem podkreślenia, który oczekuje ciągów znaków. – Gregor

Odpowiedz

11

Możesz użyć select_, jak sugerował Gregor, ale nie musisz tego robić.

library(dplyr) 

x <- read.csv(text = "sd1_scale1,sd1_scale2,sd1_scale3,sd2_scale1,sd2_scale2,sd2_scale3 
1,2,3,4", header = TRUE) 


makeData1 <- function(x, sdNumber) { 
    # Using `one_of` as explained in ?select 
    select(x, one_of(paste0("sd", sdNumber, "_scale", 1:2))) 
} 

makeData2 <- function(x, sdNumber) { 
    # Same effect using nonstandard evaluation, see vignette("nse") 
    select_(x, .dots = paste0("sd", sdNumber, "_scale", 1:2)) 
} 

x %>% makeData1(2)  
x %>% makeData2(2) # same result 

mam to od this gist

+0

Exellect! Twoje rozwiązanie działało nawet w bardzo skomplikowanym przypadku z łańcuchem. Wielkie dzięki! –

+0

Otrzymuję ustawienie błędu x "Błąd podczas skanowania (plik ... wiersz 1 nie miał 6 elementów" –

+1

@MikeHoney Trudno jest skopiować/wkleić karty. Zmieniłem je na przecinki. – nacnudus

Powiązane problemy