2016-06-29 8 views
0

Ich habe den folgenden Beispieldatenrahmen:Erste die Mittelwert von zwei Zeilen in Datenrahmen basierend auf dem Zustand einer Spalte

df<-data.frame(A=c(rep(1:4,4)),B=runif(16,min=0,max=16),c=rnorm(16, mean=6,sd=2)) 

Ich mag den Datenrahmen reduzieren, indem Sie einen neuen Wert für die Spalte A zu schaffen als der Durchschnitt zweier bestehender Werte. Erstellen Sie beispielsweise einen neuen Datenrahmen mit Werten von A als 1,2.5,4 anstelle von 1:4. Dadurch werden die Zeilen des df, die 2 und 3 enthalten, entfernt und das neue df enthält nur 12 Zeilen statt 16.

EDIT

gewünschte Ausgabe ist soetwas wie dieses.

A   B  c 
1 1 8.248871 4.402726 
2 2.5 11.694196 4.2878085 
4 4 8.036312 2.014886 
5 1 9.828333 3.240945 
6 2.5 1.151633 2.918831 
8 4 12.176981 4.874183 
9 1 14.067821 5.480923 
10 2.5 6.145208 6.139448 
12 4 6.352356 2.586025 
13 1 3.423057 5.114978 
14 2.5 11.005555 3.265489 
16 4 14.579750 3.783269 
+0

Was zu den Reihen von 'B' passieren wird und 'C'? – akash87

+0

@ akash87 B und C werden unter der Bedingung von A gemittelt. – G1124E

+0

Können Sie Ihre gewünschte Ausgabe angeben? – 989

Antwort

2

würde ich eine Minimierungsfunktion schreiben:

collapse_df <- function(mydf, column, omit, pair, FUN) { 
    ind <- which(mydf[,column] %in% pair[1]) 
    ind2 <- mydf[,column] %in% pair[-1] 
    m <- mapply(function(x,y) lapply(mydf[x:y,!names(mydf) %in% omit], FUN), ind, ind+1L) 
    mydf[ind,] <- cbind.data.frame(mydf[ind,omit], t(m)) 
    mydf[!ind2,] 
} 

collapse_df(df, "A", pair=2:3, FUN=mean) 
#  A   B   c 
# 1 1.0 1.060170 4.797753 
# 2 2.5 9.577249 6.635214 
# 4 4.0 5.612720 3.413631 
# 5 1.0 1.734932 10.487560 
# 6 2.5 9.577249 6.635214 
# 8 4.0 6.529387 5.760596 
# 9 1.0 2.517647 5.469165 
# 10 2.5 9.577249 6.635214 
# 12 4.0 4.243273 6.493916 
# 13 1.0 10.118011 4.431953 
# 14 2.5 9.577249 6.635214 
# 16 4.0 1.563981 5.047428 

Wir können auch mit anderen Funktionen wie der Median oder Summe zusammenfassen:

collapse_df(df, column="A", pair=2:3, FUN=median) 
collapse_df(df, "A", 2:3, sum) 
collapse_df(iris[-5], column=1, seq(5,6,.1), median) 
+0

Danke. Ich habe 13 Variablen wie A B C, wie kann ich mit der obigen Lösung fortfahren? – G1124E

+0

Prüfen Sie immer noch '2' und' 3' in Spalte 'A'? –

+0

@ Pierre Lafortune Ja. Aber meine tatsächlichen Werte sind wie "400" und "500" anstelle von "2" und "3". Ich denke, das ist kein Problem. – G1124E

Verwandte Themen