【问题标题】:Split data.frame row into multiple rows based on commas根据逗号将 data.frame 行拆分为多行
【发布时间】:2015-04-20 21:12:39
【问题描述】:

我正在尝试根据字符序列“,”在data.frame 中拆分一行。这是一个例子:

mydat <- data.frame(v1 = c("name, name2", "name3", "name4, name5"),
                v2 = c("1, 2", "3", "4, 5"), 
                v3 = c(1, 2, 3))

我想最终得到一个data.frame,就像这样:

 v1   v2   v3
name  1    1
name2  2   1
name3  3   2
name4  4   2
name5  5   3

有什么建议吗?

【问题讨论】:

    标签: r string


    【解决方案1】:

    这应该可行。

    install.packages("splitstackshape")
    library(splitstackshape)
    out <- concat.split.multiple(mydat, c("v1","v2"), seps=",", "long")
    
    
    out
         v1 v2 v3
    1:  name  1  1
    2: name2  2  1
    3: name3  3  2
    4: name4  4  3
    5: name5  5  3
    

    【讨论】:

    • 太棒了!感谢您将我的注意力转移到那个包裹上!
    • concat.split.multiple() 已弃用。请改用cSplit()
    【解决方案2】:

    这是使用data.table 包及其新tstrsplit 函数的另一种方式

    library(data.table) # v >= 1.9.5
    setDT(mydat)[, lapply(.SD, tstrsplit, ", "), by = v3]
    #    v3    v1 v2
    # 1:  1  name  1
    # 2:  1 name2  2
    # 3:  2 name3  3
    # 4:  3 name4  4
    # 5:  3 name5  5
    

    【讨论】:

      【解决方案3】:

      对于后代,倾向于使用tidyverse 包的用户可以使用tidyrseparate_rows 函数以及来自dplyrselect(以保持列的顺序)来完成此操作:

      library(tidyverse)
      
      mydat %>% separate_rows(v1,v2,sep=", ") %>% 
              select(v1, v2, v3)
      
      #     v1 v2 v3
      #1  name  1  1
      #2 name2  2  1
      #3 name3  3  2
      #4 name4  4  3
      #5 name5  5  3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-13
        • 2018-11-02
        • 1970-01-01
        • 1970-01-01
        • 2019-11-10
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多