2016-05-06 9 views
-2

Ich bin neu in R. Ich muss Mittel der Variablen für ein regelmäßiges Intervall für jedes Individuum berechnen. Ich habe diesen einfachen Datenrahmen.Berechnen Mittelwerte von Spalten in einer Sequenz für jede Zeile

df = data.frame(id=c("A","B","C","D"), 
      x1=c(3,5,7,2), x2= c(5,3,7,3), x3=c(5,6,4,4), x4=c(5,3,7,3), 
      x5=c(5,3,7,3), x6=c(5,4,7,1), x7= c(5,7,7,3), x8= c(5,3,8,3), 
      x9= c(4,3,2,3)) 

Was ich berechnen wollen, ist mittels jeder 4. Spalte (zB: Mittelwert für x1, x4, x7, Variablen für jeden einzelnen und x2, x5, x8 für jedes einzelne etc.) als neuer Datenrahmen . Meine Ausgabe sollte wie folgt aussehen.

 y1  y2  y3 
A 4.333333 5.000000 4.666667 
B 5.000000 3.000000 4.333333 
C 7.000000 7.333333 4.333333 
D 2.666667 3.000000 2.666667 

Im eigentlichen Datenrahmen habe ich 120 Variablen und 40 Personen.

Ich suchte nach früheren Posts und versuche, es auf folgende Weise zu tun. Aber die Art, wie ich mich bewerbe, ist falsch.

 df2<-with(df,(seq([,2], [,10], by=3)),FUN= function(x) mean(x, na.rm=TRUE)) 

Vielen Dank für einen Hinweis.

+0

' colMeans (df [1]) verwenden könnte? – alistaire

+0

@ Zheyuan und @ Alistaire Ich habe die Frage bearbeitet. Hoffe das klärt es. @ Zheyuan, ja du hast Recht. – sriya

Antwort

1

Für den Datenrahmen in dem gezeigten Beispiel Sie den folgenden Code

new.df <- data.frame(id = c("A", "B", "C", "D")) 
for (i in 2:4) { 
    id <- seq(i, ncol(df), 3) 
    new.df[, i] <- rowMeans(df[,id]) 
} 

einfach erweitern, um sie Ihren tatsächlichen Datenrahmen verwenden können. Vielleicht ist eine For-Schleife nicht die beste Lösung, aber die erste, die mir in den Sinn kam. [F (1, 10, = 3)] `-

+1

Bro, Nizza Lösung. Aber um es generischer zu machen, können Sie erwägen, 'id <- seq (i, 10, 3)' durch 'id <- seq (i, ncol (df), 3)' –

+1

einen netten Hinweis zu ersetzen, ich füge es hinzu. Vielen Dank! –

+0

Vielen Dank. Es funktioniert wunderbar mit meinen tatsächlichen Daten. – sriya

1

Wir auch lapply mit Reduce

n <- 3 
Reduce(`+`,lapply(seq(2, ncol(df), by =n), 
      function(i) df[i:(min(c(ncol(df), i+n-1)))]))/n 
#  x1  x2  x3 
#1 4.333333 5.000000 4.666667 
#2 5.000000 3.000000 4.333333 
#3 7.000000 7.333333 4.333333 
#4 2.666667 3.000000 2.666667