【问题标题】:R data.table split a row into multiple rows based on string values [duplicate]R data.table根据字符串值将一行拆分为多行[重复]
【发布时间】:2020-08-24 07:56:42
【问题描述】:

我有一个这样的 data.table:

dt <- data.table("title"=c("First Title", "Second Title", "Third Title", "Fourth Title"), 
                 "sha"=c("12345", "2345; 66543; 33423", "22222; 12345678;", "666662345; 444"))

我怎样才能得到这个:

      title                sha
1:  First Title           12345
2: Second Title           2345 
3: Second Title           66543
4: Second Title           33423
5:  Third Title           22222
6:  Third Title           12345678
7: Fourth Title           666662345
8: Fourth Title           444

提前致谢!

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这是一种适合您的tstrsplit 方法:

    library(data.table)
    dt[, lapply(.SD, function(x) unlist(tstrsplit(x, "; ?"))),
       .SDcols = "sha",by = c("title","date")]
              title     date       sha
    1:  First Title 1/1/2020     12345
    2: Second Title 1/2/2020      2345
    3: Second Title 1/2/2020     66543
    4: Second Title 1/2/2020     33423
    5:  Third Title 1/3/2020     22222
    6:  Third Title 1/3/2020  12345678
    7: Fourth Title 1/4/2020 666662345
    8: Fourth Title 1/4/2020       444
    

    数据

    dt <- data.table("title"=c("First Title", "Second Title", "Third Title", "Fourth Title"), 
                      "sha"=c("12345", "2345; 66543; 33423", "22222; 12345678;", "666662345; 444"),
                      "date" = c("1/1/2020","1/2/2020","1/3/2020","1/4/2020"))
    

    【讨论】:

    • 是否可以在此操作之后保留其他列而不仅仅是标题和 sha,例如我还有一个日期列
    【解决方案2】:

    这是我的dplyr 解决方案:

    dt %>% 
      group_by(title) %>% 
      separate_rows(sha, sep = ";") %>% 
      mutate(sha = as.numeric(sha)) %>% 
      filter(!is.na(sha))
    

    应该给你这个:

    # A tibble: 8 x 2
    # Groups:   title [4]
      title              sha
      <chr>            <dbl>
    1 First Title      12345
    2 Second Title      2345
    3 Second Title     66543
    4 Second Title     33423
    5 Third Title      22222
    6 Third Title   12345678
    7 Fourth Title 666662345
    8 Fourth Title       444
    

    【讨论】:

    • @Blind0ne 更简单的方法:dt %&gt;% separate_rows(sha, sep = ";") %&gt;% na_if("") %&gt;% drop_na()
    • @Neel 谢谢!
    • 您实际上并不需要drop_na(),但您确实需要过滤空向量。 separate_rows(dt,sha) %&gt;% filter(sha != "").
    【解决方案3】:

    这是另一个使用data.table的解决方案:

    dt[, .(sha = unlist(tstrsplit(sha, ";", type.convert = TRUE))), by = "title"]
    
    #           title       sha
    # 1:  First Title     12345
    # 2: Second Title      2345
    # 3: Second Title     66543
    # 4: Second Title     33423
    # 5:  Third Title     22222
    # 6:  Third Title  12345678
    # 7: Fourth Title 666662345
    # 8: Fourth Title       444
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 2013-02-12
      • 2020-09-24
      • 2016-04-15
      • 2012-08-09
      • 2021-07-11
      • 1970-01-01
      相关资源
      最近更新 更多