我经常处理这种形式的对象:
v <- list(one = c(a = 1, b = 2, c = 3), two = c(a = 10, b = 20, d = 30, c = 40))
我希望通过元素名称外连接这些向量,以获得:
index value.x value.y
1 a 1 10
2 b 2 20
3 c 3 40
4 d NA 30
我已编写代码来执行此操作。简而言之,将向量转换为数据帧并通过连续合并减少。但是我想知道我是否一直在重新发明轮子,并且包中或R基座中包含一些功能,可能已经过优化。这似乎是一项非常普遍的任务。
答案 0 :(得分:2)
不确定这会比您的方法更简单,但您可以使用reshape2
,lapply
和as.list。我认为melt
`dcast
library(reshape2)
dcast(melt(lapply(v, as.list)), L2 ~L1)
## L2 one two
## 1 a 1 10
## 2 b 2 20
## 3 c 3 40
## 4 d NA 30
答案 1 :(得分:2)
以下是基础R中的两个选项。他们需要先将list
转换为data.frame
。
v2 <- data.frame(do.call(rbind,
strsplit(names(unlist(v)), "\\.")),
unlist(v))
names(v2) <- c("time", "id", "value")
xtabs(value ~ id + time, v2)
# time
# id one two
# a 1 10
# b 2 20
# c 3 40
# d 0 30
reshape(v2, direction="wide", idvar="id", timevar="time")
# id value.one value.two
# one.a a 1 10
# one.b b 2 20
# one.c c 3 40
# two.d d NA 30
我不知道更直接的方法来分割使用names
产生的unlist
,但一旦完成,您尝试进行的操作变得更加容易。
分配新名称是为了使输出更“整洁”。
答案 2 :(得分:1)
这是一个基本解决方案:
> do.call( merge, list(v[[1]], v[[2]], by="row.names", all=TRUE))
Row.names x y
1 a 1 10
2 b 2 20
3 c 3 40
4 d NA 30
有关长度&gt; 2的更多列表,您可以使用as.data.frame.table
从命名向量转换为双列data.frame
> v <- list(one = c(a = 1, b = 2, c = 3),
two = c(a = 10, b = 20, d = 30, c = 40),
three = c(a = 1, b = 2, c = 3))
> setNames(Reduce(function(x,y) {
merge(x,y,all=T, by ='Var1')},lapply(v, as.data.frame.table)),
c('index', names(v)))
index one two three
1 a 1 10 1
2 b 2 20 2
3 c 3 40 3
4 d NA 30 NA