【问题标题】:Split/melt data [duplicate]拆分/熔化数据 [重复]
【发布时间】:2016-08-15 14:35:23
【问题描述】:

假设我有以下data.frame

df <- data.frame(letters = c("a, b", "a", "b", "a, c"), value = c(1, 2, 3, 4))
df
#>   letters value
#> 1    a, b     1
#> 2       a     2
#> 3       b     3
#> 4    a, c     4

我想拆分/融化到

#>   letters value
#> 1       a     1
#> 2       b     1
#> 3       a     2
#> 4       b     3
#> 5       a     4 
#> 6       c     4 

为了每个letters有一个记录

【问题讨论】:

    标签: r dplyr plyr reshape2


    【解决方案1】:

    你可以试试strsplit。根据,拆分字符,然后重复值字段。

    char <- strsplit(as.character(df$letters), ',')
    data.frame(letter=unlist(char), value=rep(df$value, sapply(char, FUN=length)))
    
    
       letter value
    #1      a     1
    #2      b     1
    #3      a     2
    #4      b     3
    #5      a     4
    #6      c     4
    

    根据 cmets 中的@docendo discimus 更新,您可以尝试更快的结果,

    char <- strsplit(as.character(df$letters), ',', fixed = T)
    data.frame(letter=unlist(char), value=rep(df$value, lengths(char)))
    

    【讨论】:

    • 您可以使用fixed = TRUE 来加快字符串拆分,并使用lengths(char) 代替sapply(char, FUN=length)
    【解决方案2】:

    我们可以使用cSplit

     library(splitstackshape)
     cSplit(df, "letters", ", ", "long")
    #   letters value
    #1:       a     1
    #2:       b     1
    #3:       a     2
    #4:       b     3
    #5:       a     4
    #6:       c     4
    

    【讨论】:

      【解决方案3】:

      你也可以这样一步一步来

      df <- data.frame(letters = c("a, b", "a", "b", "a, c"), value = c(1, 2, 3, 4))
      l <- do.call(c,strsplit(as.character(df$letters),split = ","))
      Indx <- grepl(",",df$letters)
      x <- c()
      for(i in 1:length(Indx)){
        ifelse(Indx[i],x <- c(x,rep(df$value[i],2)),x<-c(x,df$value[i]))
      }
      
      df <- data.frame(l=l,x=x)
      

      【讨论】:

        【解决方案4】:
        library(dplyr)
        library(tidyr)
        
        df <- data.frame(letters = c("a, b", "a", "b", "a, c"), value = c(1, 2, 3, 4))
        
        df %>% mutate(letters = strsplit(as.character(letters), ", ")) %>% unnest(letters)
        
        Source: local data frame [6 x 2]
        
          value letters
          (dbl)   (chr)
        1     1       a
        2     1       b
        3     2       a
        4     3       b
        5     4       a
        6     4       c
        

        【讨论】:

        • 不错的答案 - 您也可以使用 strsplit(as.character(letters), ", ", fixed=TRUE) 来加快字符串拆分
        猜你喜欢
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        • 2015-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多