【问题标题】:Separate rows by matching two columns in similar pattern通过匹配相似模式的两列来分隔行
【发布时间】:2019-08-06 22:33:27
【问题描述】:

我有类似的数据

df1 <- data.frame(A = c("P,Q","X,Y"), B = c("P1,Q1",""), C = c("P2,Q2","X2,Y2"))

我正在寻找类似的输出

output <- data.frame(A = c("P","Q","X","Y"), B = c("P1","Q1","",""), C = c("P2","Q2","X2","Y2"))

我尝试使用下面提到的单独行,但它与逗号分隔的字符串不匹配。

separate_rows(df1, A, sep=",") %>%
  separate_rows(B) %>%
  separate_rows(C)

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    我喜欢splitstackshape这样的操作包,

    library(splitstackshape)
    
    cSplit(df1, splitCols = names(df1), sep = ',', direction = 'long')
    #   A  B  C
    #1: P P1 P2
    #2: Q Q1 Q2
    

    【讨论】:

      【解决方案2】:

      你只需要这样做:

      library(tidyr)
      separate_rows(df1, A, B, C, convert = TRUE)
      

      输出:

        A  B  C
      1 P P1 P2
      2 Q Q1 Q2
      

      如果您有 NA 和空字符串,请编辑:

      data:
      df1 <- data.frame(A = c("P,Q","X,Y"), B = c("P1,Q1",""), C = 
      c("P2,Q2","X2,Y2"))
      
      
      Code:
      
      df1 <- data.frame(lapply(df1, as.character), stringsAsFactors=FALSE)
      df1[df1 == ""] <- "0,0"
      df1 <- separate_rows(df1, A, B, C, convert = TRUE)
      df1[df1 == "0"] <- ""
      

      输出:

        A  B  C
      1 P P1 P2
      2 Q Q1 Q2
      3 X    X2
      4 Y    Y2
      

      【讨论】:

      • 只是另一个复杂性,收到此错误“错误:所有嵌套列必须具有相同数量的元素。”可能我也有一些空白单元格。遇到这种情况该怎么办?
      • 抱歉你的第一个例子没有NA,我会尽快更新。
      • 我编辑了我的答案,这不是很漂亮,但我会这样做,因为这很简单。似乎separate_rows() 函数没有内置参数可用于NA
      【解决方案3】:

      使用base Rstrsplit 的选项

      data.frame(lapply(df1, function(x) strsplit(as.character(x), ",")[[1]]))
      #   A  B  C
      #1 P P1 P2
      #2 Q Q1 Q2
      

      或者scan

      data.frame(lapply(df1, function(x) 
           scan(text = as.character(x), what = "", sep=",", quiet = TRUE)))
      

      【讨论】:

        【解决方案4】:

        正如 Gainz 的回答所建议的那样,separate_rows(df1, A, B, C, convert = T) 工作得非常好。

        但是,如果您在数据框中确实有空白单元格,那么它确实会变得更难使用,因为它会给您一个关于所有列的行数不同的错误。

        我建议使用您知道不会有空白值的列。假设它是 A 列。

        我首先将数据框转换为小标题,然后将所有因子列转换为字符列。然后我会用正确数量的逗号替换空白单元格。那么separate_rows()应该可以正常工作了。

        那么代码将如下所示:

        
        df1_tibble <- df1 %>% 
          as_tibble() %>% 
          mutate_if(is.factor, as.character)
        
        df1_clean <- df1_tibble %>% 
          mutate(count = str_count(A, ",") + 1) %>% 
          mutate(temp_str = map_chr(count, ~ rep("", .x) %>% paste0(collapse = ","))) %>% 
          mutate_at(vars(B, C), funs(ifelse(str_length(.) == 0, temp_str, .))) %>% 
          select(A, B, C)
        
        df1_clean
        #> # A tibble: 2 x 3
        #>   A     B     C    
        #>   <chr> <chr> <chr>
        #> 1 P,Q   P1,Q1 P2,Q2
        #> 2 X,Y   ,     X2,Y2
        
        df1_clean %>% separate_rows(A, B, C)
        #> # A tibble: 4 x 3
        #>   A     B     C    
        #>   <chr> <chr> <chr>
        #> 1 P     P1    P2   
        #> 2 Q     Q1    Q2   
        #> 3 X     ""    X2   
        #> 4 Y     ""    Y2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-31
          • 1970-01-01
          • 2017-09-27
          • 1970-01-01
          • 2018-09-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多