Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在数据复杂的情况下如何分隔_行_R_Tidyverse_Tidyr_Delimiter_Delimiter Separated Values - Fatal编程技术网

R 在数据复杂的情况下如何分隔_行

R 在数据复杂的情况下如何分隔_行,r,tidyverse,tidyr,delimiter,delimiter-separated-values,R,Tidyverse,Tidyr,Delimiter,Delimiter Separated Values,说真的,这个问题本来不是我的。促使我把它放在一个简化的箱子里 因此,我必须根据分隔符(即)将输入单元格(在列中)的数据分隔成单独的行在当前场景中。这可以使用tidyr::separate_rows()轻松完成。列中的数据已连接。现在的问题,实际上有两个,是- 可能有用分隔的文本但可以位于闭括号内(),例如(text\u A;text\u B),该括号将被左键连接,且不被分隔 每行中不同列的单元格之间的连接数可能不均匀。在这种情况下,该行将被分解为单独的行,等于最大连接数。对于连接较少的其他列,最

说真的,这个问题本来不是我的。促使我把它放在一个简化的箱子里

因此,我必须根据分隔符(即
)将输入单元格(在列中)的数据分隔成单独的行在当前场景中。这可以使用
tidyr::separate_rows()
轻松完成。列中的数据已连接。现在的问题,实际上有两个,是-

  • 可能有用
    分隔的文本
    但可以位于闭括号内
    ()
    ,例如
    (text\u A;text\u B)
    ,该括号将被左键连接,且不被分隔
  • 每行中不同列的单元格之间的连接数可能不均匀。在这种情况下,该行将被分解为
    单独的行
    ,等于最大连接数。对于连接较少的其他列,最后一个text_值可能只是重复
  • 可再现的示例如下所示


    input提取想要的组。计算每行的最大长度和填充值

    input <- input %>%
      mutate(across(everything(), str_extract_all, pattern = "(\\([^\\(\\)]+\\)|[^;]+)")) 
    
    input_l <- pmap_int(input, ~max(map_int(list(...), length)))
    
    input %>%
      split(seq_len(nrow(.))) %>%
      map(flatten) %>%
      map2_dfr(input_l, function(row, l) map_dfr(row, ~c(.x, rep(last(.x), l - length(.x))))) 
    
    input%
    突变(跨越(everything(),str_extract_all,pattern=“(\\([^\\(\\)]+\\)\\[^;]+]))
    输入百分比
    拆分(序号(nrow(%))%>%
    地图(展平)%>%
    map2_-dfr(输入_-l,函数(行,l)映射_-dfr(行,~c(.x,rep(last(.x),l-length(.xе))
    

    这将提供以下输出

      col_1 Col_2           Col_3  Col_4                
      <chr> <chr>           <chr>  <chr>                
    1 A     Text_A          Text_1 Text_a               
    2 A     Text_B          Text_1 (Text_b;Text_c)      
    3 A     Text_B          Text_1 (Text_d;Text_dd)
    4 B     Text_C          Text_2 Text_e               
    5 B     Text_C          Text_3 Text_e               
    6 C     Text_D          Text_4 Text_f               
    7 C     (Text_E;Text_F) Text_4 Text_g 
    
    第1列第2列第3列第4列
    一个文本一个文本一个文本
    2 A Text_B Text_1(Text_B;Text_c)
    3 A文本B文本1(文本d;文本dd)
    4 B文本C文本2文本e
    5 B文本C文本3文本e
    6 C文本D文本4文本f
    7 C(文本;文本)文本4文本
    
    以下是我的方法,假设您的列中没有序列

    input %>%
      mutate(across(-col_1,
                    ~ str_replace_all(., "\\([^)]*\\)",
                                      \(x) str_replace_all(x, ";", "<sep>")))) %>%
      pmap(\(...) {
        args <- list(...)
        entries <- map(args[-1], ~ first(str_split(., ";")))
        map(entries, \(e) {
          c(e, rep(e[length(e)], do.call(max, map(entries, length)) - length(e)))
        }) %>%
        bind_rows() %>%
        bind_cols(args[1], .)
      }) %>%
      bind_rows() %>%
      mutate(across(-col_1, ~ str_replace_all(., "<sep>", ";")))
    
    输入%>%
    突变(跨(-col_1,
    ~str\u replace\u all(,“\\([^)]*\\)”,
    \(x) str_replace_all(x,“;”,“)%%>%
    pmap(\(…){
    args%
    bind_cols(args[1],)
    }) %>%
    绑定_行()%>%
    变异(跨越(-col_1,~str_replace_all(,“”,“;”))
    
    返回:

    # A tibble: 7 x 4
      col_1 Col_2           Col_3  Col_4
      <chr> <chr>           <chr>  <chr>
    1 A     Text_A          Text_1 Text_a
    2 A     Text_B          Text_1 (Text_b;Text_c)
    3 A     Text_B          Text_1 (Text_d;Text_dd)
    4 B     Text_C          Text_2 Text_e
    5 B     Text_C          Text_3 Text_e
    6 C     Text_D          Text_4 Text_f
    7 C     (Text_E;Text_F) Text_4 Text_g
    
    #一个tible:7 x 4
    第1列第2列第3列第4列
    一个文本一个文本一个文本
    2 A Text_B Text_1(Text_B;Text_c)
    3 A文本B文本1(文本d;文本dd)
    4 B文本C文本2文本e
    5 B文本C文本3文本e
    6 C文本D文本4文本f
    7 C(文本;文本)文本4文本
    
    row3 col2应该是文本B而不是文本A。最后一个要重复的值。让我检查一下您的策略,这将开始从头开始重复值。为什么只复制最后一个值?例如,当你有1,2,3,你需要让它的长度为5,它应该是什么样子?这只是这样的要求。五行中的1,2,3的示例shd为1,2,3,3确定我编辑为仅复制最后一个值。这现在应该适用于括号内的2个以上的值。谢谢@ktiu。实际上比前面的答案要好。如果还有更多的策略/答案,我会等待,否则我会接受:)
    # A tibble: 7 x 4
      col_1 Col_2           Col_3  Col_4
      <chr> <chr>           <chr>  <chr>
    1 A     Text_A          Text_1 Text_a
    2 A     Text_B          Text_1 (Text_b;Text_c)
    3 A     Text_B          Text_1 (Text_d;Text_dd)
    4 B     Text_C          Text_2 Text_e
    5 B     Text_C          Text_3 Text_e
    6 C     Text_D          Text_4 Text_f
    7 C     (Text_E;Text_F) Text_4 Text_g