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

如何在不重复较短向量的元素的情况下cbind或rbind不同长度的向量?

/ 猿问

如何在不重复较短向量的元素的情况下cbind或rbind不同长度的向量?

慕婉清6462132 2019-08-19 16:15:21

如何在不重复较短向量的元素的情况下cbind或rbind不同长度的向量?

cbind(1:2, 1:10)  

     [,1] [,2]  

  [1,]    1    1  

  [2,]    2    2  

  [3,]    1    3  

  [4,]    2    4  

  [5,]    1    5  

  [6,]    2    6  

  [7,]    1    7  

  [8,]    2    8  

  [9,]    1    9  

 [10,]    2   10  

我想要一个像下面这样的输出


[,1] [,2]  

[1,] 1 1  

[2,] 2 2  

[3,]   3  

[4,]   4  

[5,]   5  

[6,]   6  

[7,]   7  

[8,]   8  

[9,]   9  

[10,]  10  


查看完整描述

3 回答

?
繁星淼淼

诀窍是使所有输入的长度相同。


x <- 1:2

y <- 1:10

n <- max(length(x), length(y))

length(x) <- n                      

length(y) <- n

如果您希望输出为数组,则cbind可以正常工作,但是您可以获得其他NA值来填充矩形。


cbind(x, y)

       x  y

 [1,]  1  1

 [2,]  2  2

 [3,] NA  3

 [4,] NA  4

 [5,] NA  5

 [6,] NA  6

 [7,] NA  7

 [8,] NA  8

 [9,] NA  9

[10,] NA 10

要摆脱NAs,输出必须是一个列表。


Map(function(...) 

   {

      ans <- c(...)

      ans[!is.na(ans)]

   }, as.list(x), as.list(y)

)

[[1]]

[1] 1 1


[[2]]

[1] 2 2


[[3]]

[1] 3


[[4]]

[1] 4


[[5]]

[1] 5


[[6]]

[1] 6


[[7]]

[1] 7


[[8]]

[1] 8


[[9]]

[1] 9


[[10]]

[1] 10

编辑:我交换mapply(..., SIMPLIFY = FALSE)了Map。


查看完整回答
反对 回复 2019-08-19
?
月关宝盒

我遇到了类似的问题,我想建议一些额外的解决方案,我希望,有些可能会有用。解决方案相当简单,并使用qpcR包和提供的cbind.na功能。


x <- 1:2

y <- 1:10

dta <- qpcR:::cbind.na(x, y)

结果

> head(dta)

      x y

[1,]  1 1

[2,]  2 2

[3,] NA 3

[4,] NA 4

[5,] NA 5

[6,] NA 6

一边评论

按照OP的原始示例,可以轻松删除列名称:


colnames(dta) <- NULL

该操作将完整地产生所需的输出:


> head(dta)

     [,1] [,2]

[1,]    1    1

[2,]    2    2

[3,]   NA    3

[4,]   NA    4

[5,]   NA    5

[6,]   NA    6


查看完整回答
反对 回复 2019-08-19
?
慕姐829404

辅助功能......


bind.pad <- function(l, side="r", len=max(sapply(l,length)))

{

  if (side %in% c("b", "r")) {

    out <- sapply(l, 'length<-', value=len)

  } else {

    out <- sapply(sapply(sapply(l, rev), 'length<-', value=len, simplify=F), rev)}

  if (side %in% c("r", "l")) out <- t(out)

  out

}

例子:


> l <- lapply(c(3,2,1,2,3),seq)

> lapply(c("t","l","b","r"), bind.pad, l=l, len=4)

[[1]]

     [,1] [,2] [,3] [,4] [,5]

[1,]   NA   NA   NA   NA   NA

[2,]    1   NA   NA   NA    1

[3,]    2    1   NA    1    2

[4,]    3    2    1    2    3


[[2]]

     [,1] [,2] [,3] [,4]

[1,]   NA    1    2    3

[2,]   NA   NA    1    2

[3,]   NA   NA   NA    1

[4,]   NA   NA    1    2

[5,]   NA    1    2    3


[[3]]

     [,1] [,2] [,3] [,4] [,5]

[1,]    1    1    1    1    1

[2,]    2    2   NA    2    2

[3,]    3   NA   NA   NA    3

[4,]   NA   NA   NA   NA   NA


[[4]]

     [,1] [,2] [,3] [,4]

[1,]    1    2    3   NA

[2,]    1    2   NA   NA

[3,]    1   NA   NA   NA

[4,]    1    2   NA   NA

[5,]    1    2    3   NA


查看完整回答
反对 回复 2019-08-19

添加回答

回复

举报

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