2016-10-25 115 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 

我想計算列之間的行表示與部分匹配的名字,給結果像這樣:

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 

我沒有找到關於這個問題的一些有用的提示:

Calculate row means based on (partial) matching column names

但它似乎並沒有爲我工作。下面是我使用的命令:

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

我們可以split並獲得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

謝謝,這似乎是工作!我只想了解它的功能。它是否適用於不同格式的列名稱,例如as_1,er_22等? – arielle

+0

@arielle如果名稱的格式是'as_1','er_22',那麼'sub(「_。*」,「」,names(df1))' – akrun

+1

聽起來不錯,謝謝! – arielle