bind_rows 在列表中,即使 class() 不同

问题描述 投票:0回答:2

我在下面列出了我不想做的是更改

class(Category)
中的
df2
。代码应该更改类(类别)并在
list()
对象中为其分配类别。如何解决这个问题?非常感谢。

df1 <- data_frame(ID = paste0(LETTERS[1],1:4), valueA = seq(0.1,0.4,0.1), Category= "Apples" )
df2 <- data_frame(ID = paste0(LETTERS[1],5:8), valueB = seq(0.1,0.4,0.1),  Category= seq(0.1,0.4,0.1))
df3 <- data_frame(ID = paste0(LETTERS[1],9:12), valueC = seq(0.1,0.4,0.1),  Category= "Apples3")

list1 <- list(df1, df2, df3);list1
bind_rows(list1)

Error in `bind_rows()`:
! Can't combine `..1$Category` <character> and `..2$Category` <double>.
Run `rlang::last_trace()` to see where the error occurred.
r dplyr tidyr data-manipulation tidy
2个回答
0
投票

我们可以将Category列转换为list,然后行绑定,这样我们就可以保留类:

#convert Category column into list class
list1 <- lapply(list(df1, df2, df3),
                function(i){ mutate(i, Category = as.list(Category)) })
#then bind
out <- bind_rows(list1)

#check class
class(unlist(out[1, "Category"]))
# [1] "character"
class(unlist(out[5, "Category"]))
# [1] "numeric"

0
投票

我们可以将所有列转换为

character
,然后使用
type.convert

自动更改类型
library(purrr)
library(dplyr)
 map_dfr(list1, ~ .x %>% 
  mutate(across(everything(), as.character))) %>% 
  type.convert(as.is= TRUE)

-输出

# A tibble: 12 × 5
   ID    valueA Category valueB valueC
   <chr>  <dbl> <chr>     <dbl>  <dbl>
 1 A1       0.1 Apples     NA     NA  
 2 A2       0.2 Apples     NA     NA  
 3 A3       0.3 Apples     NA     NA  
 4 A4       0.4 Apples     NA     NA  
 5 A5      NA   0.1         0.1   NA  
 6 A6      NA   0.2         0.2   NA  
 7 A7      NA   0.3         0.3   NA  
 8 A8      NA   0.4         0.4   NA  
 9 A9      NA   Apples3    NA      0.1
10 A10     NA   Apples3    NA      0.2
11 A11     NA   Apples3    NA      0.3
12 A12     NA   Apples3    NA      0.4

或者我们可以

nest

map_dfr(list1, ~ .x %>% nest(data = Category))

-输出

# A tibble: 12 × 5
   ID    valueA data             valueB valueC
   <chr>  <dbl> <list>            <dbl>  <dbl>
 1 A1       0.1 <tibble [1 × 1]>   NA     NA  
 2 A2       0.2 <tibble [1 × 1]>   NA     NA  
 3 A3       0.3 <tibble [1 × 1]>   NA     NA  
 4 A4       0.4 <tibble [1 × 1]>   NA     NA  
 5 A5      NA   <tibble [1 × 1]>    0.1   NA  
 6 A6      NA   <tibble [1 × 1]>    0.2   NA  
 7 A7      NA   <tibble [1 × 1]>    0.3   NA  
 8 A8      NA   <tibble [1 × 1]>    0.4   NA  
 9 A9      NA   <tibble [1 × 1]>   NA      0.1
10 A10     NA   <tibble [1 × 1]>   NA      0.2
11 A11     NA   <tibble [1 × 1]>   NA      0.3
12 A12     NA   <tibble [1 × 1]>   NA      0.4

© www.soinside.com 2019 - 2024. All rights reserved.