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

Cha*_*res 47 r vector

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  
Run Code Online (Sandbox Code Playgroud)

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

[,1] [,2]  
[1,] 1 1  
[2,] 2 2  
[3,]   3  
[4,]   4  
[5,]   5  
[6,]   6  
[7,]   7  
[8,]   8  
[9,]   9  
[10,]  10  
Run Code Online (Sandbox Code Playgroud)

Ric*_*ton 63

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

x <- 1:2
y <- 1:10
n <- max(length(x), length(y))
length(x) <- n                      
length(y) <- n
Run Code Online (Sandbox Code Playgroud)

如果您希望输出为数组,则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
Run Code Online (Sandbox Code Playgroud)

要摆脱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
Run Code Online (Sandbox Code Playgroud)

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

  • length(x)< - n谢谢,这正是我想要的 (2认同)
  • @Alex如果所有输入的长度都相同,则无需重复。您是否更改了答案中所说向量的长度? (2认同)

Kon*_*rad 14

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

x <- 1:2
y <- 1:10
dta <- qpcR:::cbind.na(x, y)
Run Code Online (Sandbox Code Playgroud)

结果

> head(dta)
      x y
[1,]  1 1
[2,]  2 2
[3,] NA 3
[4,] NA 4
[5,] NA 5
[6,] NA 6
Run Code Online (Sandbox Code Playgroud)

一边评论

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

colnames(dta) <- NULL
Run Code Online (Sandbox Code Playgroud)

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

> head(dta)
     [,1] [,2]
[1,]    1    1
[2,]    2    2
[3,]   NA    3
[4,]   NA    4
[5,]   NA    5
[6,]   NA    6
Run Code Online (Sandbox Code Playgroud)

  • 使用两个以上的数据集时,此解决方案特别优雅.使用`do.call(qpcR ::: cbind.na,...)`可以轻松地"cbind"一个任意长度的data.frames列表. (4认同)
  • qpcR 包中的 cbind.na 不存在(不再存在?) (4认同)

小智 5

我想提出一个使用rowr包及其cbind.fill函数的替代解决方案。

> rowr::cbind.fill(1:2,1:10, fill = NA);

   object object
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
Run Code Online (Sandbox Code Playgroud)

或者,要匹配 OP 所需的输出:

> rowr::cbind.fill(1:2,1:10, fill = '');

   object object
1       1      1
2       2      2
3              3
4              4
5              5
6              6
7              7
8              8
9              9
10            10
Run Code Online (Sandbox Code Playgroud)

  • rowr 已从 CRAN 中删除 (4认同)