R-如何访问更“复杂”列表的元素,以及将复杂列表转换为数据帧

时间:2013-04-26 12:27:16

标签: r

我有点沮丧,因为我无法弄清楚如何在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表示此处列表中的原始块编号。

提前致谢。

2 个答案:

答案 0 :(得分:1)

试试这个:

colMeans(test.results)

然后,要更改矩阵,您可以使用melt

中的reshape2
> 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

答案 1 :(得分: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