我有点沮丧,因为我无法弄清楚如何在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表示此处列表中的原始块编号。
提前致谢。
答案 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
(在您的情况下Var1
和Var2
将是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