bind vectors different lengths r code example

Example 1: r cbind vectors of unequal length

# Example usage:
# If you have several vectors that you want to combine column-wise
# or row-wise without repeating values from the shorter vectors, 
# here is the easiest approach for doing that that I've found:
# Define vectors:
vector_1 <- c("a","b","c")
vector_2 <- c("d","e","f", "g")
vector_3 <- c("h","i","j", "k", "l")

# Add NAs to shorter vectors:
n = max(length(vector_1), length(vector_2), length(vector_3))
length(vector_1) = n
length(vector_2) = n
length(vector_3) = n

cbind(vector_1, vector_2, vector_3)
     vector_1 vector_2 vector_3
[1,] "a"      "d"      "h"     
[2,] "b"      "e"      "i"     
[3,] "c"      "f"      "j"     
[4,] NA       "g"      "k"     
[5,] NA       NA       "l" 

rbind(vector_1, vector_2, vector_3)
         [,1] [,2] [,3] [,4] [,5]
vector_1 "a"  "b"  "c"  NA   NA  
vector_2 "d"  "e"  "f"  "g"  NA  
vector_3 "h"  "i"  "j"  "k"  "l" 


# Note, this can also be done with cbind.na (see below) and rbind.na

# Basic syntax for cbind.na:
# Use cbind.na which is an internal function of the qpcR package
qpcR:::cbind.na()

# Example usage:
# Install package
install.packages("qpcR")
library(qpcR)

# Define vectors:
col1 <- c("a","b","c")
col2 <- c("d","e","f", "g")
col3 <- c("h","i","j", "k", "l")

# Run regular cbind for comparison:
cbind(col1, col2, col3)
     col1 col2 col3
[1,] "a"  "d"  "h" 
[2,] "b"  "e"  "i" 
[3,] "c"  "f"  "j" 
[4,] "a"  "g"  "k" # Note that col1 has "a" and "b" repeated
[5,] "b"  "d"  "l" # col2 has "d" repeated

# Run cbind.na:
qpcR:::cbind(col1, col2, col3) # ::: is for calling internal functions
     col1 col2 col3
[1,] "a"  "d"  "h" 
[2,] "b"  "e"  "i" 
[3,] "c"  "f"  "j" 
[4,] NA   "g"  "k" 
[5,] NA   NA   "l" # Shorter vectors have NA added instead of repeating

Example 2: cbind vectors of different lengths r

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
}

Tags:

R Example