r - 列表中的 bind_rows 即使 class() 不同

标签 r dplyr tidyr data-manipulation tidy

下面有一个列表,我不想做的是更改 df2 中的 class(Category)。代码应该更改类(类别)并在 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.

最佳答案

我们可以将所有列转换为字符,然后使用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

或者我们可以嵌套

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

关于r - 列表中的 bind_rows 即使 class() 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76179536/

相关文章:

r - 使用 grep 查找带有反斜杠的字符串 - 字符转义

r - 如何在R中初始化固定长度的向量

r - Dplyr select抛出解析为整数错误的结果,但是基本select有效,为什么?

r - 两组列的平行 pivot_longer

r - 在 unnest_wider 之后命名提升向量中的列

r - 通过匹配R中的字符串将行转换为列

r - Shiny:从列表列表生成selectInput直接进入最深层

r - 使用 data.table R 在滚动基础(重置和恢复)中提取累积唯一值

重构数据 - 根据多个分组列获取平均值

r - 在 R 中使用 tidyverse 有类似于 colSums(is.na(df))?