2015-08-04 10 views
5

Mam ramkę danych z pierwszą kolumną jako identyfikator kategoryczny, drugą kolumnę jako wartość częstotliwości i pozostałe kolumny jako nieprzetworzone dane. Chcę pomnożyć wszystkie kolumny liczników przez kolumnę częstotliwości, ale nie przez pierwsze dwa.Wybieranie określonych kolumn przy użyciu funkcji mutate_each z dplyr

Wszystkie surowce kolumny count rozpocząć wielką literą, po której następuje kropka, np „L.abd”, T.xyz itp

Na przykład, jeśli mogę użyć kodu:

require(dplyr) 
    ID <- c(1,2,3,4,5,6) 
    Freq <- c(0.1,0.2,0.3,0.5,0.1,0.3) 
    L.abc <- c(1,1,1,3,1,0) 
    L.ABC <- c(0,3,2,4,1,1) 
    T.xyz <- c(1,1,1,1,0,1) 
    F.ABC <- c(4,5,6,5,3,1) 

    df <- as.data.frame(cbind(ID, Freq, L.abc, L.ABC, T.xyz, F.ABC)) 

    df_new <- df %>% mutate_each(funs(.*Freq), starts_with("L."))   

Mogę utworzyć nową ramkę danych zawierającą kolumny danych kategorycznych wraz z kolumnami zaczynającymi się od "L." które zostały pomnożone przez odpowiednią wartość częstotliwości.

Czy istnieje sposób na zmianę komendy "starts_with" w celu wybrania wszystkich kolumn rozpoczynających się od dużej litery i kropki? Moje próby datowania przy użyciu modyfikacji, takich jak "[A-Z]." nie udało się.

góry dzięki

Odpowiedz

7

dla tych przypadków, matches byłaby bardziej odpowiednia

df %>% 
     mutate_each(funs(.*Freq), matches("^[A-Z]\\.", ignore.case=FALSE)) 

Tutaj jestem przy założeniu, że chciałeś select tylko nazwy kolumn, które zaczynają się wielką literą (^[A-Z]), a następnie przez .. Musimy uciec . (\\.), w przeciwnym razie będzie traktowany jako dowolny pojedynczy znak.

Nie zmieniam niczego oprócz części starts_with. Jeśli potrzebujemy przekazać funkcję, w mutate_each, można ją przekazać wewnątrz połączenia funs. W powyższym kodzie mnożymy każdą z kolumn (.) wybranych przez matches za pomocą kolumny "Freq".

Według ?select

'pasuje (x, ignore.case = true)': wybiera wszystkie zmienne, których nazwa pasuje do wyrażenia regularnego 'x'

EDIT: Dodano @docendodiscimus Komentarz

+2

Możesz też użyć 'mecze ("^ [AZ] \\." Ignore.case = FAŁSZ)' ponieważ domyślnie jest PRAWDA, a OP chce matować wielkie litery. Porównaj na przykład 'wybierz (iris, mecze ("^[az]. * "))' I 'wybierz (iris, mecze ("^[az]. * ", Ignore.case = FALSE))' –

+0

@docendodiscimus Dzięki , nie sprawdził domyślnego przypadku. – akrun

2

Właśnie odpowiedziałem a related question od innego użytkownika, mutate_each zostanie wycofany na rzecz mutate_at.

W twoim przypadku jest równoważny kod:

df %>% mutate_at(.cols=vars(matches("^[A-Z]\\.", ignore.case=FALSE)), .funs=funs(.*Freq))

ID Freq L.abc L.ABC T.xyz F.ABC 1 1 0.1 0.1 0.0 0.1 0.4 2 2 0.2 0.2 0.6 0.2 1.0 3 3 0.3 0.3 0.6 0.3 1.8 4 4 0.5 1.5 2.0 0.5 2.5 5 5 0.1 0.1 0.1 0.0 0.3 6 6 0.3 0.0 0.3 0.3 0.3