【问题标题】:Split rows by columns content in R [duplicate]在R中按列内容拆分行[重复]
【发布时间】:2020-08-17 14:00:31
【问题描述】:

我正在为一件非常简单的事情而苦苦挣扎。我有一个数据框,其中Comments 列包含单场观察独有的信息(在这种情况下为时间)。例如:

data <- data.frame("Species" = c("TURPHI", "EMBHER", "ANTTRI"), 
                       "Date" = c("2020/06/03", "2020/06/03", "2020/06/03"), 
                       "Comments" = c("21:00;23:00;23:45", "22:01", "21:51"), 
                  stringsAsFactors = FALSE)
> data
  Species       Date          Comments
1  TURPHI 2020/06/03 21:00;23:00;23:45
2  EMBHER 2020/06/03             22:01
3  ANTTRI 2020/06/03             21:51

如果每一行在Comments 列中有超过1 个元素,我必须拆分每一行。元素由; 分隔。在前面的例子中,第 1 行必须被分成 3 行,每行都有它的时间,例如:

> data
  Species       Date  Time
1  TURPHI 2020/06/03 21:00
2  TURPHI 2020/06/03 23:00
3  TURPHI 2020/06/03 23:45
4  EMBHER 2020/06/03 22:01
5  ANTTRI 2020/06/03 21:51

非常感谢!!

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以试试这个(只指定要拆分的列数,也可以保存在新的数据框中):

    library(tidyverse)
    
    df1 <- separate_rows(data,3,sep = ';')
    

    输出:

    # A tibble: 5 x 3
      Species Date       Comments
      <chr>   <chr>      <chr>   
    1 TURPHI  2020/06/03 21:00   
    2 TURPHI  2020/06/03 23:00   
    3 TURPHI  2020/06/03 23:45   
    4 EMBHER  2020/06/03 22:01   
    5 ANTTRI  2020/06/03 21:51 
    

    【讨论】:

    • 也许library(tidyr) 更精确地指定了包。
    • @DarrenTsai 哦,是的,你是对的!但是由于 tidyverse 也会加载 tidyr 我使用 tidyverse 抱歉让您感到困惑:)
    【解决方案2】:

    base中,您可以使用strsplitdata$Comments 拆分为;,然后将结果与cbind 合并,然后使用rep 重复行。

    x <- strsplit(data$Comments, ";", fixed = TRUE)
    cbind(data[rep(seq_len(nrow(data)), lengths(x)),-3], time=unlist(x))
    #    Species       Date  time
    #1    TURPHI 2020/06/03 21:00
    #1.1  TURPHI 2020/06/03 23:00
    #1.2  TURPHI 2020/06/03 23:45
    #2    EMBHER 2020/06/03 22:01
    #3    ANTTRI 2020/06/03 21:51
    

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 2018-07-23
      • 2018-09-19
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      相关资源
      最近更新 更多