【问题标题】:Pivot longer with mutliple data points in a single column在单个列中具有多个数据点的 Pivot_longer
【发布时间】:2023-03-26 14:15:02
【问题描述】:

我有一个数据框,在同一列中包含不同数量的数据点:

library(tidyverse)


df <- tribble(~id,  ~data,
              "A", "a;b;c",
              "B",   "e;f")

我想为每个数据点获取一行,分离列data 的内容并将其分布在行上。这段代码给出了预期的结果,但是很笨拙:

df %>%
  separate(data,
           into = paste0("dat_",1:5),
           sep = ";",
           fill = "right") %>%
  pivot_longer(starts_with("dat_"),
               names_to = "data_number",
               names_pattern = "dat_(\\d+)") %>%
  filter(!is.na(value))

#> # A tibble: 5 x 3
#>   id    data_number value
#>   <chr> <chr>       <chr>
#> 1 A     1           a    
#> 2 A     2           b    
#> 3 A     3           c    
#> 4 B     1           e    
#> 5 B     2           f

首选 Tidyverse 解决方案。

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    这是一种方法

    library(dplyr)
    library(tidyr)
    library(data.table)
    df %>% 
          separate_rows(data) %>%
          mutate(data_number = rowid(id), .before = 2)
    

    -输出

    # A tibble: 5 x 3
      id    data_number data 
      <chr>       <int> <chr>
    1 A               1 a    
    2 A               2 b    
    3 A               3 c    
    4 B               1 e    
    5 B               2 f    
    

    【讨论】:

    • 太好了!如果我们希望保持纯粹的 tidyverse,我们还可以使用 group_by(id) %&gt;% mutate(data_number = row_number()) 创建 data_number。
    • @Alexlok 是的,我正在考虑让它紧凑,因为你要求紧凑。
    • 我提到它是为了完整性(无论有没有它,我都会尽快接受你的回答)。问题中提到的“笨拙”是关于必须猜测值的数量,而不是紧凑性。
    • @Alexlok 是的,我明白了。我认为group_by row_number 也很棒,但我唯一的问题是 group 属性,除非我们使用ungroup。在某些情况下,人们会忘记它并产生一些奇怪的想法
    【解决方案2】:
    library(dplyr)
    library(tidyr)
    df %>% 
        separate_rows(data)
    

    输出:

    # A tibble: 5 x 2
      id    data 
      <chr> <chr>
    1 A     a    
    2 A     b    
    3 A     c    
    4 B     e    
    5 B     f  
    

    【讨论】:

      【解决方案3】:

      使用str_splitunnest -

      library(tidyverse)
      
      df %>%
        mutate(data = str_split(data, ';'), 
               data_number = map(data, seq_along)) %>%
        unnest(c(data, data_number))
      
      #  id    data  data_number
      #  <chr> <chr>       <int>
      #1 A     a               1
      #2 A     b               2
      #3 A     c               3
      #4 B     e               1
      #5 B     f               2
      

      【讨论】:

        猜你喜欢
        • 2022-09-27
        • 2021-06-26
        • 1970-01-01
        • 2021-05-28
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 2011-11-11
        • 2020-02-01
        相关资源
        最近更新 更多