2015-08-04 6 views
5

Ho una cornice dati con la prima colonna come identificatore categoriale, la seconda colonna come valore di frequenza e le colonne rimanenti come conteggi di dati non elaborati. Voglio moltiplicare tutte le colonne di conteggio per la colonna di frequenza ma non per le prime due.Selezione di colonne specifiche quando si utilizza la funzione mutate_each da dplyr

Tutte le colonne di conteggio prime iniziano con una lettera maiuscola seguita da un punto, ad esempio "L.abd", T.xyz ecc

Per esempio, se io uso il codice:

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."))   

Posso creare un nuovo frame di dati contenente le colonne di dati categoriali insieme a quelle colonne che iniziano con "L." che sono stati moltiplicati per il corrispondente valore di frequenza.

C'è un modo per modificare il comando "starts_with" per selezionare tutte le colonne che iniziano con una lettera maiuscola e un punto? I miei tentativi di datare utilizzando modifiche come "[A-Z]." sono stati infruttuosi

Grazie in anticipo

risposta

7

Per questi casi, matches sarebbe più appropriato

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

Ecco, io parto dal presupposto che si voleva select solo i nomi delle colonne che iniziano con la lettera maiuscola (^[A-Z]) seguita da un .. Dobbiamo sfuggire allo . (\\.), altrimenti verrà considerato come un singolo carattere.

Non cambio nulla tranne la parte starts_with. Nel mutate_each se è necessario passare una funzione, può essere passata all'interno di una chiamata funs. Nel codice sopra, stiamo moltiplicando ciascuna delle colonne (.) selezionate dal matches con la colonna 'Freq'.

Secondo ?select

'partite (x, ignore.case = true)': seleziona tutte le variabili il cui nome corrisponde l'espressione regolare 'x'

EDIT: Aggiunto @docendodiscimus commento

+2

si potrebbe desiderare di usare 'partite ("^ [AZ] \\.", Ignore.case = FALSE)' poiché il suo valore predefinito è TRUE e OP vuole scrivere in maiuscolo le lettere maiuscole. Confronta per esempio 'select (iris, matches ("^[az]. * "))' E 'select (iris, matches ("^[az]. * ", Ignore.case = FALSE))' –

+0

@docendodiscimus Grazie , non ha controllato il caso predefinito. – akrun

2

Ho appena risposto a related question da altro utente, mutate_each sarà deprecato in favore di mutate_at.

Nel tuo caso il codice equivalente è:

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