为了账号安全,请及时绑定邮箱和手机立即绑定

合并(合并)不同长度的向量

/ 猿问

合并(合并)不同长度的向量

慕莱坞7535251 2019-11-14 15:27:58

我有几个长度不等的向量,我想要cbind它们。我将向量放入列表中,并尝试结合使用do.call(cbind, ...):


nm <- list(1:8, 3:8, 1:5)

do.call(cbind, nm)


#      [,1] [,2] [,3]

# [1,]    1    3    1

# [2,]    2    4    2

# [3,]    3    5    3

# [4,]    4    6    4

# [5,]    5    7    5

# [6,]    6    8    1

# [7,]    7    3    2

# [8,]    8    4    3

# Warning message:

#   In (function (..., deparse.level = 1)  :

#         number of rows of result is not a multiple of vector length (arg 2)

如预期的那样,所得矩阵中的行数是最长向量的长度,较短向量的值将被回收以弥补该长度。


相反,我想用NA值填充较短的向量,以获得与最长的向量相同的长度。我希望矩阵看起来像这样:


#      [,1] [,2] [,3]

# [1,]    1    3    1

# [2,]    2    4    2

# [3,]    3    5    3

# [4,]    4    6    4

# [5,]    5    7    5

# [6,]    6    8    NA

# [7,]    7    NA   NA

# [8,]    8    NA   NA

我该怎么做呢?


查看完整描述

3 回答

?
慕容4345310

如果索引的数字超出了它返回的对象的大小,则可以使用索引NA。这适用于用定义的任意数量的行foo:


nm <- list(1:8,3:8,1:5)


foo <- 8


sapply(nm, '[', 1:foo)

编辑:


或者在一行中使用最大的向量作为行数:


sapply(nm, '[', seq(max(sapply(nm,length))))

从R 3.2.0您可以使用lengths(“获取列表中的每个元素的长度”),而不是sapply(nm, length):


sapply(nm, '[', seq(max(lengths(nm))))


查看完整回答
反对 回复 2019-11-14
?
慕尼黑的夜晚无繁华

在调用do.call之前,应使用NA填充向量。


nm <- list(1:8,3:8,1:5)


max_length <- max(unlist(lapply(nm,length)))

nm_filled <- lapply(nm,function(x) {ans <- rep(NA,length=max_length);

                                    ans[1:length(x)]<- x;

                                    return(ans)})

do.call(cbind,nm_filled)


查看完整回答
反对 回复 2019-11-14
?
蛊毒传说

晚了聚会,但是你可以cbind.fill从rowr包中使用fill = NA


library(rowr)

do.call(cbind.fill, c(nm, fill = NA))


#  object object object

#1      1      3      1

#2      2      4      2

#3      3      5      3

#4      4      6      4

#5      5      7      5

#6      6      8     NA

#7      7     NA     NA

#8      8     NA     NA

如果您有一个具名list而想要保留标题,则可以使用setNames


nm <- list(a = 1:8, b = 3:8, c = 1:5)

setNames(do.call(cbind.fill, c(nm, fill = NA)), names(nm))


#  a  b  c

#1 1  3  1

#2 2  4  2

#3 3  5  3

#4 4  6  4

#5 5  7  5

#6 6  8 NA

#7 7 NA NA

#8 8 NA NA


查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 40 浏览
我要回答

相关问题推荐

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信