2016-12-05 14 views
0

私はこれに新しいことがあるので、できるだけ明確にしようとします。R:ベクトル内のすべてのアイテムに対してRで操作を繰り返す方法は?

私は5つのベクトルで構成されるデータフレームを持っています。最初のものには国名が含まれ、他の5つはアンケートに由来する値です。各行は、その調査に誰かから与えられた回答を表しています。

Country  V1 V2 V3 V4 V5 
Canada  1 2 4 1 2 
Canada  1 3 2 2 3 
Switzerland 3 1 1 1 1 
Switzerland 1 4 3 4 2 

私は私の調査の質問の結果を集計してから、私は国ごとに1つの値で終わるので、私のデータフレーム内のすべての国の平均を計算するコードを作成したいです。

vAggregateCan <- (V1 + V2 + V3 + V4 + V5)/5 

canValue <- mean(vAggregateCan) 

私は例として示したコードから結果の値に関連付けられている私の最初のデータフレームに存在するそれぞれの国の唯一つのエントリを含む新しいデータフレームで終わるしたいです。それはこのように見えるはずです。

Country  Value 
Canada  canValue 
Switzerland swissValue 

問題は、私は、特定の国のための値を集計するためにRを伝える方法がわからない、と私は同じ動作を繰り返すことなく、単に可能な限りその操作を行うための方法を見つけるしたいと思います何度も。

私は、私はそれで新しいの一種だと私は私の質問がクリアされているかはわからない言ったように。助けてくれてありがとう。

+0

これはgroup_by )関数dplyr – gfgm

+0

各国の5行が2行あるので、カナダとスイスの場合、平均で10を割り切ってはいけませんか? – aichao

+0

これを確認してください:https://stackoverflow.com/questions/10945703/calculate-row-means-on-subset-of-columns、私はあなたの質問に答えると思います! – guzman

答えて

-1

df <- data.frame(v1, v2, v3, v4, v5) means <- apply(df, 1, mean)

あなたはdata.frame()機能を使用してデータフレームを作成することができ、私はdplyrのdata_frame()を使用することをお勧めします。 apply()関数を使用すると、行(2番目の引数を1に設定)または列(2番目の引数を2に設定)、次に3番目の引数として使用する関数を使用できます。

+2

これは単に行手段を生成します。行と国の手段を問う質問があります。 – gfgm

+1

-1。これは行のための手段を与えるだけです。問題は明らかに国の手段を求めている。国を取得する手段の1つは、関数aggregate(?aggregate)を持つ行を追加することです。そうすれば、これは非常に役に立つかもしれません。 – hodgenovice

1

により、あなたが実行するための複数の操作を持っているという事実のために、リンクが正確な複製ではありません。 1)各国の平均を求め、2)各列の平均を求める。最も単純なアプローチは、base関数を使用することです。

df2 <- aggregate(. ~ Country, data=df1, mean) 
data.frame(Country=df2$Country, Mean=rowMeans(df2[-1])) 
#  Country Mean 
# 1  Canada 2.1 
# 2 Switzerland 2.1 

data.tabledplyrパッケージは動作しますが、彼らは、彼らが最高の列ごとに動作するように構築されていますので、を介してジャンプするために余分なフープを必要とします。 See this explanation for more on why row-wise operations are discouraged

しかし、あなたはそれらのパッケージを使用する必要がある場合:

library(data.table) 
setDT(df1)[, .(Mean = rowMeans(.SD)), by=Country][, .(Mean=mean(Mean)), by=Country] 
#  Country Mean 
# 1:  Canada 2.1 
# 2: Switzerland 2.1 

library(dplyr) 
df1 %>% group_by(Country) %>% 
    summarise_all(mean, na.rm=TRUE) %>% 
    rowwise() %>% do(data.frame(Country=.$Country, Mean=rowMeans(.[,-1]))) 
#  Country Mean 
# 1  Canada 2.1 
# 2 Switzerland 2.1 
+0

data.table 'melt(setDT(DF))[、平均(値)、by = Country]'と同じように、飛び越してはいけません。 – Frank

-1

rowMeans機能は、手段の行方向のセットを与えることができ、その後tapplyは、それらの国の値の範囲内に集約することができます。

tapply(rowMeans(df[-1]), df[['Country']], mean) 
    Canada Switzerland 
     2.1   2.1 

の場合そのオブジェクトのインデックスを作成して単一の値を抽出する必要があります。

tapply(rowMeans(df[-1]), df[['Country']], mean)['Canada'] 
Canada 
    2.1 
関連する問題