2016-05-16 3 views
0

Gibt es eine Möglichkeit, neue Spalten mit den Mittelwerten anderer vorhandener Spalten einzufügen, die mit einem bestimmten Text beginnen?muate_each in dplyr: neue Spalte mit den mittleren Zeilenwerten anderer Spalten mit gemeinsamem Text erstellen

Zum Beispiel in diesem Datensatz:

zz <-(" 
id 20_1 20_2 20_3 22_1 22_2 22_3  
1 .  4.00  3.50 5.80 5.35 5.15  
2 3.50 .  3.30 5.65 5.40 5.05  
3 2.80 3.40 3.80 5.30 5.25 5.30  
") 

df <- read.table(text=zz, header = TRUE) 

Id möchte zwei neue Spalten 20_4 erstellen und mit dem mittleren Zeilenwert des 20_1 22_4: 20_3 und 22_1: 22_3 jeweils ...

id 20_1 20_2 20_3 20_4 22_1 22_2 22_3 22_4 
1 NA  4.00 3.50 3.75 5.80 5.35 5.15 5.43 
2 3.50 NA  3.30 3.40 5.65 5.40 5.05 5.37 
3 2.80 3.40 3.80 3.33 5.30 5.25 5.30 5.28 

Könnte mir jemand dabei helfen? Ich bin immer noch dplyr lernen ...

+0

Haben Sie wirklich '.' in Ihren Daten oder versuchen Sie' NA' zu imitieren? –

+0

Danke! bearbeitete Frage .. – Juanchi

Antwort

0

Ein anderer Weg, dies zu tun, wäre mit ‚zusammenfassen‘ in dplyr die Variablen anlegen möchten Sie

zznew<-zz %>% 
    group_by(id)%>% 
    summarize("20_4"=mean(`20_1`:`20_3`,na.rm=TRUE),"22_4"=mean(`22_1`:`22_3`,na.rm=TRUE))%>% 
    left_join(zz,zznew,by="id") 

Edit: Im Nachhinein glaube, ich bin falsch zu sagen, verwenden ‚zusammenfassen‘. Hier ist eine andere Art und Weise, dass die Mittel für jede Zeile für die ausgewählten Spalten berechnen wird und binden sie an den Datenrahmen:

zzz<-cbind(zz,"20_4"=rowMeans(zz[,c("20_1","20_2","20_3")],na.rm=TRUE), 
     "22_4"=rowMeans(zz[,c("22_1","22_2","22_3")],na.rm=TRUE)) 
+0

Es ist etwas falsch, weil es 20_4 = (2, 3, 2.5) gibt, wenn es 20_4 = (3.75, 3.4, 3.33) sein sollte – Juanchi

+0

Sorry, ich bearbeitete die Antwort, um eine andere Methode hinzuzufügen, die funktionieren sollte – collnell

+0

das ist eine gute lösung aus dplyr ... ich dachte es könnte mit mutate_each() einfach sein, danke! – Juanchi

0

Eine elegante Lösung hierfür wäre wahrscheinlich Nicht-Standard-Auswertung werden:

Lassen Sie uns einen df ähnlich wie bei Ihnen betrachten:

zz = data_frame(
    `20_1` = rnorm(5), 
    `20_2` = rnorm(5), 
    `20_3` = rnorm(5), 
    `22_1` = rnorm(5), 
    `22_2` = rnorm(5), 
    `22_3` = rnorm(5) 
) 
  1. Erste Wir erstellen einen Zeichenvektor mit dem Namen der Spalten, die wir zusammen berechnen möchten. Der folgende Code wählt dynamisch die alle Spaltennamen mit 20_ Start:

    to_aggregate = names(zz)[grepl("^20", names(zz))] 
    
  2. Wir schaffen eine Formel, die den Mittelwert dynamisch berechnen:

    agg_formula = as.formula(paste0(" ~ mean(c(", paste0("`", to_aggregate, "`", collapse = ", "), "))")) 
    

    dies die Formel schaffen: ~ bedeuten (c ('20_1', '20_2', '20_3'))

  3. dplyr Wir verwenden kann Zeile für Zeile zu gehen und die dynamische gelten obige Formel generiert:

    zz %>% 
        mutate(tmp_ID = row_number()) %>% 
        group_by(tmp_ID) %>% 
        mutate_(.dots = setNames(list(agg_formula), 'res')) %>% 
        mutate(check_res = (`20_1` + `20_2` + `20_3`)/3) %>% 
        ungroup() 
    
+0

Es gibt mir diesen Fehler ... 'r Fehler im Parse (Text = x, keep.source = FALSE): : 1: 13: unerwarteter Eingang 1: ~ mean (c (20_ ^ ' – Juanchi

+0

Yeah Sie erhalten den Fehler, weil die Spaltennamen ungültige Namen haben, also müssen Sie sie mit einem \ umwickeln. Ich änderte die agg_formula jetzt, um das" '" vor und nach dem Reihennamen zu haben und es funktioniert jetzt –

Verwandte Themen