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?
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With