0

我有点沮丧,因为我无法弄清楚如何在 R 中使用更“复杂”的列表正常工作。请看一看。

我从这个列表开始:

> test.results
  [,1]      [,2]      [,3]      [,4]      [,5]     
A 0.9375027 0.9995755 0.9997706 0.6900084 0.9207406
B 0.9375027 0.9375027 0.9997706 0.9375027 0.9207406
C 0.9375027 0.9375027 0.9997706 0.9375027 0.9954647

我想在列表的每个块(块#1 将是 [,1])上应用一个函数。

> as.matrix(test.results[,1])
  [,1]     
A 0.9375027
B 0.9375027
C 0.9375027

假设我想分别计算 A、B、C 上每个块 [,1] 到 [,5] 的平均值。对于块#1,这与计算向量 c(0.9375027, 0.9375027, 0.9375027) 的平均值相同,对于块#2,计算向量 c(0.9995755, 0.9995755, 0.9995755) 的平均值...

或者,我也有兴趣将列表转换为数据框:

1 A 0.9997706
1 B 0.9997706
1 C 0.9997706
2 A 0.9995755
2 B 0.9375027
2 C 0.9375027
. . . .
5 A  0.9207406 
5 B  0.9207406
5 C  0.9954647

1,2,..,5 表示此处列表中的原始块号。

提前致谢。

4

2 回答 2

1

对于您的列意味着计算,colMeans是最好的答案。

要将矩阵置于长格式(问题的第二部分),您可以使用stack

    dd <- stack(test.results)
    dd$ind <- rownames(test.results)

      values ind
1  0.9375027   A
2  0.9375027   B
3  0.9375027   C
4  0.9995755   A
5  0.9375027   B
6  0.9375027   C
7  0.9997706   A
8  0.9997706   B
9  0.9997706   C
10 0.6900084   A
11 0.9375027   B
12 0.9375027   C
13 0.9207406   A
14 0.9207406   B
15 0.9954647   C
于 2013-04-26T13:27:07.053 回答
1

尝试这个:

colMeans(test.results)

然后为了改变你的矩阵,你可以使用meltfromreshape2

> m <- matrix(1:12, ncol=4)
> library(reshape2)
> melt(m)
   Var1 Var2 value
1     1    1     1
2     2    1     2
3     3    1     3
4     1    2     4
5     2    2     5
6     3    2     6
7     1    3     7
8     2    3     8
9     3    3     9
10    1    4    10
11    2    4    11
12    3    4    12

(在您的情况下Var1Var2将是 1,2,..,5 和 A、B 和 C)

编辑:

test.result <- as.matrix(read.delim(text="0.9375027 0.9995755 0.9997706 0.6900084 0.9207406
0.9375027 0.9375027 0.9997706 0.9375027 0.9207406
0.9375027 0.9375027 0.9997706 0.9375027 0.9954647", header=F, sep=" "))

rownames(test.result) <- LETTERS[1:3]
colnames(test.result) <- NULL

> test.result
       [,1]      [,2]      [,3]      [,4]      [,5]
A 0.9375027 0.9995755 0.9997706 0.6900084 0.9207406
B 0.9375027 0.9375027 0.9997706 0.9375027 0.9207406
C 0.9375027 0.9375027 0.9997706 0.9375027 0.9954647

> class(test.result)
[1] "matrix"

> colMeans(test.result)
[1] 0.9375027 0.9581936 0.9997706 0.8550046 0.9456486

编辑2:

您有一个“结构化”为矩阵的列表......可能是这样的:

test <- structure(list(1, 11, 111, 2, 22, 222), .Dim = c(3L, 2L), .Dimnames = list(
  NULL, c("a", "b")))

> test
     a   b  
[1,] 1   2  
[2,] 11  22 
[3,] 111 222

> is.list(test)
[1] TRUE
> is.matrix(test)
[1] TRUE
> colMeans(test)
Error in colMeans(test) : 'x' must be numeric

如果是这样,您只需要取消列出,然后为对象提供以前的结构:

> (test <- matrix(unlist(test), nrow(test)))
     [,1] [,2]
[1,]    1    2
[2,]   11   22
[3,]  111  222
> is.list(test)
[1] FALSE
> colMeans(test)
[1] 41 82
于 2013-04-26T12:31:53.650 回答