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.