我对R中的列表有疑问。我在16列表中有一个列表,其中包含一个包含如下变量的列表:
x
[[1]]
A 1 3
B 4 2
[[2]]
C 23 4
D 9 22
E 4 54
A,B,C和D是列表中的rownames。现在我想创建一个只粘贴数据帧中的rownames的文件。数据框中的每一行在总列表中包含1个列表。
A B
C D E
任何人都可以帮我吗?我想也许有些像do.call(rbind,rownames(x))
修改! 2011年5月8日
有没有办法按列表保存rownames列表?那么最终数据中没有NA,数据是不相等的?
谢谢大家!
答案 0 :(得分:3)
假设x
的性质,如果我们使用:
x <- list(matrix(c(1,4,3,2), ncol = 2,
dimnames = list(c("A","B"), NULL)),
matrix(c(23,9,4,4,22,54), ncol = 2,
dimnames = list(c("C","D","E"), NULL)))
给出:
> x
[[1]]
[,1] [,2]
A 1 3
B 4 2
[[2]]
[,1] [,2]
C 23 4
D 9 22
E 4 54
然后
> lapply(x, rownames)
[[1]]
[1] "A" "B"
[[2]]
[1] "C" "D" "E"
似乎是唯一合理的答案。除非我们用某些东西填充("A","B")
向量,否则我们不能使用矩阵或数据帧,因为组件长度不匹配。因此do.call()
想法失败的原因之一是:
> do.call(rbind, rownames(x))
Error in do.call(rbind, rownames(x)) : second argument must be a list
> do.call(rbind, lapply(x, rownames))
[,1] [,2] [,3]
[1,] "A" "B" "A"
[2,] "C" "D" "E"
Warning message:
In function (..., deparse.level = 1) :
number of columns of result is not a multiple of vector length (arg 1)
要使用NA
填充结果并获取数据框,我们可以执行以下操作:
out <- lapply(x, rownames)
foo <- function(x, max, repl = NA) {
if(length(x) == max)
out <- x
else {
out <- rep(repl, max)
out[seq_along(x)] <- x
}
out
}
out <- lapply(out, foo, max = max(sapply(out, length)))
(out <- do.call(rbind, out))
最后一行给出:
> (out <- do.call(rbind, out))
[,1] [,2] [,3]
[1,] "A" "B" NA
[2,] "C" "D" "E"
如果你想要那么好的印刷,那么
> print(format(out), quote = FALSE)
[,1] [,2] [,3]
[1,] A B NA
[2,] C D E
是R内的一个选项。
答案 1 :(得分:1)
这应该这样做:
lapply(x, function(curdfr){paste(rownames(curdfr))})
这会生成一个向量,每个元素都是列表元素的空格分隔的rownames。
答案 2 :(得分:0)
您的样本数据:
x <- list(
matrix(c(1,4,3,2), nrow = 2, dimnames = list(LETTERS[1:2])),
matrix(c(23,9,4,4,22,54), nrow = 3, dimnames = list(LETTERS[3:5]))
)
你想要什么:
unlist(lapply(x, rownames))
或者,如果您热衷于do.call
,那么这相当于:
do.call(c, lapply(x, rownames))