2016-05-06 6 views
-2

私はRが初めてです。変数の平均を変数ごとに計算する必要があります。私はこの単純なデータフレームを持っています。私は計算したい何各行の列の平均を計算する

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)) 

は、すべての4列目の手段である(例:各個人などについて、X1、X4、X7、各個人とx2、X5の変数、X8の平均)は、新しいデータフレームとして。私の出力は次のようになるはずです。

 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 

実際のデータフレームには、120個の変数と40個の個体があります。

以前の投稿を検索し、次のようにしてみてください。しかし、確かに私が適用する方法は間違っています。

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

ありがとうございました。あなたがちょうどあなたの実際のデータフレームにそれを拡張し、次のコード

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]) 
} 

を使用することができます例に示したデータフレームの場合

+0

'colMeansとlapplyを使用することができる[配列(1、10、=による3)]'? – alistaire

+0

@ Zheyuanと@ alistaire私は質問を編集しました。これを明確にすることを願っています。 @浙江省、はい、あなたは正しいです。 – sriya

答えて

1

。たぶん、forループは最善の解決策ではありませんが、私の心の中で最初に来たものです。

+1

Bro、Nice Solution。しかし、より一般的なものにするためには、 'id < - seq(i、10,3)'を 'id < - seq(i、ncol(df)、3)'に置き換えてみてください。 –

+1

素敵なヒント、ありがとうございました! –

+0

大変ありがとうございます。それは私の実際のデータで美しく動作します。 – sriya

1

また(DF [ - 1])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