【问题标题】:Strsplit on a column of a data frame [duplicate]在数据框的列上进行Strsplit [重复]
【发布时间】:2016-12-26 00:16:25
【问题描述】:

我有一个data.frame,其中一个变量是向量(或列表),如下所示:

MyColumn <- c("A, B,C", "D,E", "F","G")
MyDF <- data.frame(group_id=1:4, val=11:14, cat=MyColumn)

#   group_id val    cat
# 1        1  11 A, B,C
# 2        2  12    D,E
# 3        3  13      F
# 4        4  14      G

我想要一个新的数据框,其行数与向量一样多

FlatColumn <- unlist(strsplit(MyColumn,split=","))

看起来像这样:

MyNewDF <- data.frame(group_id=c(rep(1,3),rep(2,2),3,4), val=c(rep(11,3),rep(12,2),13,14), cat=FlatColumn)

#   group_id val cat
# 1        1  11   A
# 2        1  11   B
# 3        1  11   C
# 4        2  12   D
# 5        2  12   E
# 6        3  13   F
# 7        4  14   G

本质上,对于作为MyColumn(字母A到G)列表元素的每个因素,我想分配列表的相应值。每个因素在MyColumn 中只出现一次。

这种重塑/取消列出/合并有没有一种巧妙的方法?我想出了一个非常繁琐的for-循环MyDF 的行strsplit(MyColumn,split=",") 的相应元素的长度。我很确定一定有更优雅的方式。

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:

    您可以从tidyr 使用separate_rows

    tidyr::separate_rows(MyDF, cat)
    
    #   group_id val cat
    # 1        1  11   A
    # 2        1  11   B
    # 3        1  11   C
    # 4        2  12   D
    # 5        2  12   E
    # 6        3  13   F
    # 7        4  14   G
    

    【讨论】:

      【解决方案2】:

      怎么样

      lst <- strsplit(MyColumn, split = ",")
      k <- lengths(lst)    ## expansion size
      FlatColumn <- unlist(lst, use.names = FALSE)
      MyNewDF <- data.frame(group_id = rep.int(MyDF$group_id, k),
                            val = rep.int(MyDF$val, k),
                            cat = FlatColumn)
      
      #  group_id val cat
      #1        1  11   A
      #2        1  11   B
      #3        1  11   C
      #4        2  12   D
      #5        2  12   E
      #6        3  13   F
      #7        4  14   G
      

      【讨论】:

        【解决方案3】:

        我们可以从splitstackshape使用cSplit

        library(splitstackshape)
        cSplit(MyDF, "cat", ",", "long")
        #    group_id val cat
        #1:        1  11   A
        #2:        1  11   B
        #3:        1  11   C
        #4:        2  12   D
        #5:        2  12   E
        #6:        3  13   F
        #7:        4  14   G
        

        我们还可以使用 do with base Rstrsplit 将 'cat' 列拆分为 list,使用 'lst' 的 lengths 复制 'MyDF' 的行序列,并创建unlisting 'lst' 的 'cat' 列。

        lst <- strsplit(as.character(MyDF$cat), ",")
        transform(MyDF[rep(1:nrow(MyDF), lengths(lst)),-3], cat = unlist(lst))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-29
          • 1970-01-01
          • 2017-02-07
          • 1970-01-01
          • 2019-03-07
          • 1970-01-01
          • 2017-12-13
          • 2013-09-13
          相关资源
          最近更新 更多