【问题标题】:Convert a single column into multiple columns based on delimiter in R基于R中的分隔符将单列转换为多列
【发布时间】:2021-05-07 22:06:00
【问题描述】:

我有以下数据框:

ID Parts
-- -----
1  A:B::
2  X2:::
3  ::J4:
4  A:C:D:G4:X6

我希望通过 : 分隔符将 Parts 列转换为多列。所以它应该看起来像:

ID A  B  X2  J4  C  D  G4  X6 ........
-- -  -  --  --  -  -  --  -- 
1  A  B  na  na  na na na  na
2  na na X2  na  na na na  na
3  na na na  J4  na na na  na
4  A  na na  na  C  D  G4  X6

在那里我不会提前知道潜在列的数量。

我在这一项上遇到了我的匹配 - strsplit() by delim 我可以做到,但只能在 Parts 列中使用固定数量的实体

【问题讨论】:

    标签: r dplyr tidyverse reshape


    【解决方案1】:

    tidyr 中的 seperate 函数是您要查找的吗?

    https://tidyr.tidyverse.org/reference/separate.html

    它可能需要一些花哨的正则表达式实现,但可能会起作用。

    【讨论】:

    • 至少我提供了正确的链接...感谢您的澄清!
    【解决方案2】:

    您可以使用tidyr::seperatetidyr::pivot_widertidyr::pivot_longer 的组合。首先,您仍然可以使用strsplit 来确定列数Parts 拆分为而不是唯一值的数量(如何工作):

    library(dplyr)
    library(tidyr)
    library(stringr)
    
    n_col <- max(stringr::str_count(df$Parts, ":")) + 1
    
    df %>% 
      tidyr::separate(Parts, into = paste0("col", 1:n_col), sep = ":") %>% 
      dplyr::mutate(across(everything(), ~dplyr::na_if(., ""))) %>% 
      tidyr::pivot_longer(-ID) %>% 
      dplyr::select(-name) %>% 
      tidyr::drop_na() %>% 
      tidyr::pivot_wider(id_cols = ID,
                         names_from = value)
    
    
         ID A     B     X2    J4    C     D     G4    X6   
      <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
    1     1 A     B     NA    NA    NA    NA    NA    NA   
    2     2 NA    NA    X2    NA    NA    NA    NA    NA   
    3     3 NA    NA    NA    J4    NA    NA    NA    NA   
    4     4 A     NA    NA    NA    C     D     G4    X6 
    

    工作原理

    使用此代码,您无需知道唯一值的数量 - 枢轴会处理这些问题。您需要知道的是Parts 将与seperate 拆分成多少个新列。这很容易通过计算分隔符的数量并用str_count 加一来实现。这样,您就有了适当数量的列,可以通过分隔符将 Parts 分隔到其中。

    这是因为pivot_longer 将创建一个包含重复ID 的两列数据框和一个带有Parts 分隔值的列——IDParts 配对。然后,当您使用pivot_wider 时,将为Parts 的每个唯一值自动创建列,并且该值保留在列中。此函数自动填充NA,其中未找到IDParts 组合。

    尝试逐个管道运行此管道,以便更好地了解是否需要。


    数据

    lines <- "
    ID Parts
    1  A:B::
    2  X2:::
    3  ::J4:
    4  A:C:D:G4:X6
    "
    
    df <- read.table(text = lines, header = T)
    

    【讨论】:

    • 非常感谢 - 这是一些 dplyr/tidyr 链,并且通过它学到了一些技巧。
    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 2023-03-05
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多