如何cbind或rbind不同长度的向量而不重复较短向量的元素?

如何cbind或rbind不同长度的向量而不重复较短向量的元素?,r,vector,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 诀窍是使所有输入的长度相

我想要一个如下的输出

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  
要去掉
NA
s,输出必须是一个列表

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
Map(函数(…)
{
ans辅助功能

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

bind.pad我遇到了类似的问题,我想建议一些人可能会觉得有用的附加解决方案。该解决方案非常简单,并利用了软件包和提供的功能

例子 旁白 按照原始示例,可以轻松删除列名:

> head(dta)
      x y
[1,]  1 1
[2,]  2 2
[3,] NA 3
[4,] NA 4
[5,] NA 5
[6,] NA 6

我想提出一个替代解决方案,利用软件包及其功能

> head(dta)
     [,1] [,2]
[1,]    1    1
[2,]    2    2
[3,]   NA    3
[4,]   NA    4
[5,]   NA    5
[6,]   NA    6
或者,为了匹配OP的期望输出:

> 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

鉴于上面的一些解决方案依赖于不再可用的包,这里提供了一个仅使用
dplyr.

> 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
bind\u cols\u fill%add\u row(!!first:=rep(NA,max\u rows-nrow(df)))
})%%>%bind_cols()
}
请注意,这需要一个数据帧列表,因此如果只想组合两个向量,则会有点麻烦:

bind_cols_fill <- function(df_list) {

  max_rows <- map_int(df_list, nrow) %>% max()
  
  map(df_list, function(df) {
    if(nrow(df) == max_rows) return(df)
    first <- names(df)[1] %>% sym()
    df %>% add_row(!!first := rep(NA, max_rows - nrow(df)))
  }) %>% bind_cols()
}

x另一个没有依赖关系的解决方案:

x <- 1:2
y <- 1:10
bind_cols_fill(list(tibble(x), tibble(y)) 
my_绑定长度(x=y)){

len_diff Yup,这叫做循环利用,是R的基本概念之一。您还想要什么其他行为?这似乎也随着时间的推移得到了解决:,您也可以做
R[这(!is.na(R))]
假设
R
是矩阵的一行。长度(x)如果您只是想编写文件,那么在我执行cbind(x,y)时,出于某种原因,您可以通过执行x[is.NA(x)]将NA替换为空白我得到了重复…你如何添加NA?@Alex如果所有输入的长度都相同,那么就没有什么可重复的。你是否像我在回答中所说的那样更改了向量的长度?当处理两个以上的数据集时,此解决方案尤其优雅。使用
do.call(qpcR::cbind.NA,…)
允许轻松地
cbind
数据列表。任意长度的帧。cbind.na在包中不存在(不再存在?),QPCROWR已从CRAN中删除
> head(dta)
     [,1] [,2]
[1,]    1    1
[2,]    2    2
[3,]   NA    3
[4,]   NA    4
[5,]   NA    5
[6,]   NA    6
> 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
> 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
bind_cols_fill <- function(df_list) {

  max_rows <- map_int(df_list, nrow) %>% max()
  
  map(df_list, function(df) {
    if(nrow(df) == max_rows) return(df)
    first <- names(df)[1] %>% sym()
    df %>% add_row(!!first := rep(NA, max_rows - nrow(df)))
  }) %>% bind_cols()
}
x <- 1:2
y <- 1:10
bind_cols_fill(list(tibble(x), tibble(y)) 
my_bind <- function(x, y){
if(length(x = x) > length(x = y)){
    len_diff <- length(x) - length(y)
    y <- c(y, rep(NA, len_diff))
}else if(length(x = x) < length(x = y)){
    len_diff <- length(y) - length(x)
    x <- c(x, rep(NA, len_diff))
}
cbind(x, y)
}
my_bind(x = letters[1:4], y = letters[1:2])