如何将向量绑定到不同的列中,将 NA 留在剩余的单元格中
How to rbind vectors into different columns, leaving NAs in remaining cells
假设我有未指定数量的不同长度的向量,我想有效地将它们绑定在一起,但需要注意的是它们必须各自占据结果 data.frame 中的不同列。您可以假设向量包含在一个列表中,但您不能依赖于列表中可能定义的任何组件名称。
下面我展示了一个随机样本输入 (lv
) 和一个糟糕的解决方案来生成所需的输出,通过重复 NA
并组合每个输入向量手动构建结果 data.frame按名字。
set.seed(1);
lv <- list(a=sample(30,5),b=sample(30,3),c=sample(30,7),d=sample(30,2));
lv;
## $a
## [1] 8 11 17 25 6
##
## $b
## [1] 27 28 19
##
## $c
## [1] 19 2 6 5 18 10 30
##
## $d
## [1] 15 21
##
with(lv,data.frame(a=c(a,rep(NA,length(b)+length(c)+length(d))),b=c(rep(NA,length(a)),b,rep(NA,length(c)+length(d))),c=c(rep(NA,length(a)+length(b)),c,rep(NA,length(d))),d=c(rep(NA,length(a)+length(b)+length(c)),d)));
## a b c d
## 1 8 NA NA NA
## 2 11 NA NA NA
## 3 17 NA NA NA
## 4 25 NA NA NA
## 5 6 NA NA NA
## 6 NA 27 NA NA
## 7 NA 28 NA NA
## 8 NA 19 NA NA
## 9 NA NA 19 NA
## 10 NA NA 2 NA
## 11 NA NA 6 NA
## 12 NA NA 5 NA
## 13 NA NA 18 NA
## 14 NA NA 10 NA
## 15 NA NA 30 NA
## 16 NA NA NA 15
## 17 NA NA NA 21
注:不一定要用rbind()
,我只是觉得这样最能说明问题。另一种思考方式是我想 cbind()
向量到不同的(从不重叠)行。
尝试
library(reshape2)
library(data.table)
dcast(setDT(melt(lv))[, rn:=.I], rn~L1, value.var='value')
或
dcast(setDT(melt(lv), keep.rownames=TRUE),
as.numeric(rn)~L1, value.var='value')
或按照@David Arenburg 的建议
recast(lv, seq_along(unlist(lv)) ~ L1)
或使用base R
d1 <- stack(lv)
reshape(transform(d1, rn=1:nrow(d1)), idvar='rn',
timevar='ind', direction='wide')
假设我有未指定数量的不同长度的向量,我想有效地将它们绑定在一起,但需要注意的是它们必须各自占据结果 data.frame 中的不同列。您可以假设向量包含在一个列表中,但您不能依赖于列表中可能定义的任何组件名称。
下面我展示了一个随机样本输入 (lv
) 和一个糟糕的解决方案来生成所需的输出,通过重复 NA
并组合每个输入向量手动构建结果 data.frame按名字。
set.seed(1);
lv <- list(a=sample(30,5),b=sample(30,3),c=sample(30,7),d=sample(30,2));
lv;
## $a
## [1] 8 11 17 25 6
##
## $b
## [1] 27 28 19
##
## $c
## [1] 19 2 6 5 18 10 30
##
## $d
## [1] 15 21
##
with(lv,data.frame(a=c(a,rep(NA,length(b)+length(c)+length(d))),b=c(rep(NA,length(a)),b,rep(NA,length(c)+length(d))),c=c(rep(NA,length(a)+length(b)),c,rep(NA,length(d))),d=c(rep(NA,length(a)+length(b)+length(c)),d)));
## a b c d
## 1 8 NA NA NA
## 2 11 NA NA NA
## 3 17 NA NA NA
## 4 25 NA NA NA
## 5 6 NA NA NA
## 6 NA 27 NA NA
## 7 NA 28 NA NA
## 8 NA 19 NA NA
## 9 NA NA 19 NA
## 10 NA NA 2 NA
## 11 NA NA 6 NA
## 12 NA NA 5 NA
## 13 NA NA 18 NA
## 14 NA NA 10 NA
## 15 NA NA 30 NA
## 16 NA NA NA 15
## 17 NA NA NA 21
注:不一定要用rbind()
,我只是觉得这样最能说明问题。另一种思考方式是我想 cbind()
向量到不同的(从不重叠)行。
尝试
library(reshape2)
library(data.table)
dcast(setDT(melt(lv))[, rn:=.I], rn~L1, value.var='value')
或
dcast(setDT(melt(lv), keep.rownames=TRUE),
as.numeric(rn)~L1, value.var='value')
或按照@David Arenburg 的建议
recast(lv, seq_along(unlist(lv)) ~ L1)
或使用base R
d1 <- stack(lv)
reshape(transform(d1, rn=1:nrow(d1)), idvar='rn',
timevar='ind', direction='wide')