2016-10-25 7 views
5

に基づいて、私はこのようになりテーブルを有する:R:行は、平均算出列名部分一致

er er.1 as as.1 as.2 rt op 
a 1 6 90 8 6 4 87 
b 1 8 56 7 5 5 9 
c 8 7 6 4 5 9 6 
d 1 0 8 6 4 3 6 
e 9 7 2 4 3 89 7 

Iは、部分的に一致する名前の列の間の平均の行を計算する結果を得たいとこのように:

Calculate row means based on (partial) matching column names

er as   rt  op 
a 3.5 34.66666667 4  87 
b 4.5 22.66666667 5  9 
c 7.5 5   9  6 
d 0.5 6   3  6 
e 8 3   89  7 

私はこの質問にいくつかの有用なヒントを見つけました

しかし、それは私のために働いていないようです。ここで私が使用するコマンドは以下のとおりです。

test <- read.table("test.txt", header=TRUE, row.names=1) 

colnames <- c("er", "er", "as", "as", "as", "rt", "op") 

means <-sapply(colnames, function(x) rowMeans(test [, grep(x, names(test))]) ) 

この最後のコマンドは私に次のエラーを与える:ここで

Error in rowMeans(test[, grep(x, names(test))]) : 
    'x' must be an array of at least two dimensions 

は私のデータフレームのdputです:

structure(list(er = c(1L, 1L, 8L, 1L, 9L), er.1 = c(6L, 8L, 7L, 
0L, 7L), as = c(90L, 56L, 6L, 8L, 2L), as.1 = c(8L, 7L, 4L, 6L, 
4L), as.2 = c(6L, 5L, 5L, 4L, 3L), rt = c(4L, 5L, 9L, 3L, 89L 
), op = c(87L, 9L, 6L, 6L, 7L)), .Names = c("er", "er.1", "as", 
"as.1", "as.2", "rt", "op"), class = "data.frame", row.names = c("a", 
"b", "c", "d", "e")) 

任意のアイデア理由私はこのエラーが発生しており、これをどのように修正することができますか?

ありがとうございました!

答えて

5

我々はrowMeans

sapply(split.default(df1, sub("\\..*", "", names(df1))), rowMeans) 
#  as er op rt 
#a 34.66667 3.5 87 4 
#b 22.66667 4.5 9 5 
#c 5.00000 7.5 6 9 
#d 6.00000 0.5 6 3 
#e 3.00000 8.0 7 89 
+0

はあなたをsplitと感謝を取得することができ、それが動作しているようです!私はこれが何をしているのか理解したいと思います。異なるフォーマットの列名でも動作しますか? as_1、er_22など? – arielle

+0

@arielle名前の形式が 'as_1'、' er_22'、 'sub(" _。* "、"(names)(df1)) ' – akrun

+1

なら、 – arielle