2016-05-12 8 views
0

Angenommen, ich habe 120 Spalten in der Tabelle, die letzten 100 sind "week1", "week2", ... , "week100". Kann ich eine neue Spalte erstellen und sie dem Mittelwert der 100 Wochen anpassen?Wenn Sie muate() in dplyr verwenden, wie erstellt man eine neue Spalte als Summe oder Mittelwert oder mehrere Zellen in der Zeile, ohne alle Namen einzugeben?

Ich versuchte mutate(table, mean_value = mean(num_range("week", 1:100))), und es funktioniert nicht.

Vielen Dank im Voraus.

Antwort

0

Ich kann zwei Ansätze dafür sehen. Für beide lassen sich sagen, dass Ihre Daten wie folgt aussehen:

df = data_frame(var1 = rnorm(10), 
      var2 = rnorm(10), 
      othervar1 = rnorm(10), 
      othervar2 = rnorm(10), 
      othervar3 = rnorm(10)) 

und wir wollen den Mittelwert der Variablen berechnen, die in ihrem Namen die Zeichenfolge ‚othervar‘:

to_aggregate = names(df)[grepl("othervar", names(df))] 

Ansatz 1: NSE

Die eleganteste Lösung ist wahrscheinlich eine nicht standardisierte Auswertung. Zuerst erstellen wir die Formel für den Mittelwert:

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

, die dynamisch die Formel für den Mittelwert erzeugt: ~ (othervar1 + othervar2 + othervar3)/3. Dann können wir dplyr gehen verwenden Zeile für Zeile und die Formel anwenden:

df %>% 
    mutate(tmp_ID = row_number()) %>% 
    group_by(tmp_ID) %>% 
    mutate_(.dots = setNames(list(agg_formula), 'res')) %>% 
    mutate(check_res = (othervar1 + othervar2 + othervar3)/3) %>% 
    ungroup() 

     var1  var2 othervar1 othervar2 othervar3 tmp_ID   res check_res 
    (dbl)  (dbl)  (dbl)  (dbl)  (dbl) (int)  (dbl)  (dbl) 
1 -0.32615666 0.4713765 -0.3915121 -1.06072106 0.09051817  1 -0.45390498 -0.45390498 
2 0.57071669 1.3189079 0.8762870 -2.00557762 -0.44993910  2 -0.52640991 -0.52640991 
3 0.24825279 -0.9491394 -2.1563560 -0.01378413 -0.22521368  3 -0.79845126 -0.79845126 
4 -1.80198808 -2.2495440 -1.1170833 0.50966421 -0.56381476  4 -0.39041128 -0.39041128 

Ansatz 2:

Der zweite Ansatz Melting ist ein bisschen weniger schön (meiner Meinung nach) und es schmilzt zuerst das Datenrahmen:

library(reshape2) 
df %>% 
    mutate(tmp_ID = row_number()) %>% 
    select(tmp_ID, contains("othervar")) %>% 
    melt(id.vars = "tmp_ID") %>% 
    group_by(tmp_ID) %>% 
    summarize(res = mean(value)) 

tmp_ID   res 
(int)  (dbl) 
1  1 -0.45390498 
2  2 -0.52640991 
3  3 -0.79845126 
4  4 -0.39041128 

und wenn Sie möchten, können Sie dann mit den Originaldaten mit left_join und ‚tmp_ID‘ als Schlüssel-Join zurück.

0

Es ist nicht perfekt in eine Rohrleitung passt, aber wie wäre es:

weekdata <- select(table,week1:week100) 
table %>% mutate(meanval=rowMeans(weekdata)) 

?