Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dplyr: list of vectors to data frame with rbind_all vs bind_rows

Tags:

r

dplyr

I want to convert a list of named lists to a data frame, where some have missing columns. I can do that successfully with the deprecated rbind_all but not with the replacement bind_rows

Example List with missing Columns (el3 missing b)

ex = list(el1=c(a=1, b=2, c=3), el2=c(a=2, b=3, c=4), el3=c(a=3, c=5))

rbind_all(ex)
# A tibble: 3 x 3
      a     b     c
  <dbl> <dbl> <dbl>
1     1     2     3
2     2     3     4
3     3    NA     5


> bind_rows(ex)
Error in bind_rows_(x, .id) : Argument 3 must be length 3, not 2

Without missing columns

ex2 = list(el1=c(a=1, b=2, c=3), el2=c(a=2, b=3, c=4), el3=c(a=3, b=4, c=5))

rbind_all(ex2)
# A tibble: 3 x 3
      a     b     c
  <dbl> <dbl> <dbl>
1     1     2     3
2     2     3     4
3     3     4     5

bind_rows(ex2) # Output is transposed for some reason
# A tibble: 3 x 3
    el1   el2   el3
  <dbl> <dbl> <dbl>
1     1     2     3
2     2     3     4
3     3     4     5

How to replicate rbind_all behavior with a non-deprecated function?

like image 275
ahmohamed Avatar asked Jan 26 '23 15:01

ahmohamed


1 Answers

Please read this example in ?bind_rows:

# Note that for historical reasons, lists containg vectors are
# always treated as data frames. Thus their vectors are treated as
# columns rather than rows, and their inner names are ignored:
ll <- list(
  a = c(A = 1, B = 2),
  b = c(A = 3, B = 4)
)
bind_rows(ll)

# You can circumvent that behaviour with explicit splicing:
bind_rows(!!!ll)

Therefore, in your case, you can try:

ex = list(el1=c(a=1, b=2, c=3), el2=c(a=2, b=3, c=4), el3=c(a=3, c=5))
bind_rows(!!!ex)

# # A tibble: 3 x 3
#       a     b     c
#   <dbl> <dbl> <dbl>
# 1     1     2     3
# 2     2     3     4
# 3     3    NA     5

ex2 = list(el1=c(a=1, b=2, c=3), el2=c(a=2, b=3, c=4), el3=c(a=3, b=4, c=5))
bind_rows(!!!ex2)

# # A tibble: 3 x 3
#       a     b     c
#   <dbl> <dbl> <dbl>
# 1     1     2     3
# 2     2     3     4
# 3     3     4     5
like image 178
mt1022 Avatar answered Apr 19 '23 23:04

mt1022