7

私はこのようなdata.frameを持っています

> head(df)
            Memory    Memory    Memory    Memory    Memory     Naive     Naive
10472501  6.075714  5.898929  6.644946  6.023901  6.332126  8.087944  7.520194
10509163  6.168941  6.495393  5.951124  6.052527  6.404401  7.152890  8.335509
10496091 10.125575  9.966211 10.075613 10.310952 10.090649 11.803949 11.274480
10427035  6.644921  6.658567  6.569745  6.499243  6.990852  8.010784  7.798154
10503695  8.379494  8.153917  8.246484  8.390747  8.346748  9.540236  9.091740
10451763 10.986717 11.233819 10.643245 10.230697 10.541396 12.248487 11.823138  

Memory列の平均と列の平均を見つけたいと思いNaiveます。このaggregate関数は行を集計します。これdata.frameには潜在的に多数の行が含まれる可能性があるため、転置してから元aggregateの を適用すると、私は悪いと思い、一般的に迷惑です:colnamesdata.frame

> head(t(aggregate(t(df),list(colnames(df)), mean)))
         [,1]       [,2]      
Group.1  "Memory"   "Naive"   
10472501 "6.195123" "8.125439"
10509163 "6.214477" "7.733625"
10496091 "10.11380" "11.55348"
10427035 "6.672665" "8.266854"
10503695 "8.303478" "9.340436"

私が見逃している盲目的に明らかなことは何ですか?

4

5 に答える 5

8

私は、「長い」形式になるようにデータを再フォーマットすることを大いに支持しています。長い形式の有用性は、このような問題になると特に顕著です。reshape幸いなことに、パッケージを使用して、このようなデータをほぼすべての形式に簡単に再形成できます。

私があなたの質問を正しく理解していれば、すべての行のMemoryとの平均が必要です。Naiveなんらかの理由で、列名を で一意にする必要がありますreshape::melt()

colnames(df) <- paste(colnames(df), 1:ncol(df), sep = "_")

次に、ID列を作成する必要があります。あなたはどちらかを行うことができます

df$ID <- 1:nrow(df)

または、それらの行名が意味のある場合

df$ID <- rownames(df)

さて、reshapeパッケージで

library(reshape)
df.m <- melt(df, id = "ID")
df.m <- cbind(df.m, colsplit(df.m$variable, split = "_", names = c("Measure", "N")))
df.agg <- cast(df.m, ID ~ Measure, fun = mean)

df.agg目的の出力スニピットのようになります。

または、すべての行の全体的な平均だけが必要な場合は、ザックの提案が機能します。何かのようなもの

m <- colMeans(df)
tapply(m, colnames(df), mean)

同じ結果を得ることができますが、データフレームとしてフォーマットされています

cast(df.m, .~variable, fun = mean)
于 2010-07-28T00:17:36.690 に答える
4

のようなものはどうですか

l <-lapply(unique(colnames(df)), function(x) rowMeans(df[,colnames(df) == x]))



df <- do.call(cbind.data.frame, l)
于 2010-07-27T23:37:20.973 に答える
3

Jonathan Changの答えを明確にするために...あなたが見逃しているやみくもに明らかなことは、列を選択してrowMeansコマンドを発行するだけでよいということです。これにより、各行の平均のベクトルが得られます。彼のコマンドは、一意の列名の各グループの行平均を取得し、まさに私が作成しようとしていたものでした。サンプルデータを使用すると、彼のコマンドの結果は2つのリストになります。

rowMeansも非常に高速です。

それを分解するには、すべてのメモリ列の平均を取得するだけです

rowMeans(df[,colnames(df) == 'Memory']) #or from you example, rowMeans(df[,1:5])

それは最も単純な完全な正解です。彼に投票し、気に入った場合は彼に正解のマークを付けてください。

(BTW, I also liked Jo's recommendation to keep generally things as long data.)

于 2010-07-28T01:15:10.420 に答える
0

データをロードせずにロードしたと思いますがheader=TRUE、持っているのは因子行列であるため、一般的に良いアイデアは失敗します。

于 2010-07-27T22:53:08.447 に答える
0
m = matrix(1:12,3)
colnames(m) = c(1,1,2,2)

m

     1 1 2  2
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12

mt = t(m)
sapply(by(mt,rownames(mt),colMeans),identity)

     1    2
V1 2.5  8.5
V2 3.5  9.5
V3 4.5 10.5
于 2014-06-16T03:29:10.060 に答える