【问题标题】:R - Concatenate cell in dataframe, by group, depending on another cell valueR - 按组连接数据框中的单元格,具体取决于另一个单元格值
【发布时间】:2020-11-16 08:40:19
【问题描述】:

我有以下类型的数据集(第一行是标题):

  • content 总是文本
  • merge 总是合乎逻辑的
id1  id2  start_line end_line content           merge
A    B    1          1        "aaaa"            TRUE
A    B    4          4        "aa mm"           TRUE
A    B    5          5        "boool"           TRUE
A    B    6          6        "omw"             TRUE
C    D    6          6        "hear!"           TRUE
C    D    7          7        " me out!"        TRUE
C    D    21         21       "hello"           FALSE

问题:我需要按照非常具体的标准进行合并:

  • 具有merge = FALSE 的行必须保持原样
  • 具有相同id1、相同id2和连续start_line的行:
    • 需要在列上追加content
    • end_line 值需要更改到最后一行

所以,预期的结果是:

id1  id2  start_line end_line content             merge
A    B    1          1        "aaaa"              TRUE
A    B    4          6        "aa mm boool omw"   TRUE
C    D    6          7        "hear!  me out!"    TRUE
C    D    21         21       "hello"             FALSE

在示例中注意:

  • 最小合并是两行(id 示例:C-D,最初是第 6 行和第 7 行)
  • 可以合并多行(ID A-B 的示例,最初是第 2、3、4 行)

我尝试了一系列非常大且效率低下的循环,只合并了两行。这就是为什么我不在这里发布我的尝试。

【问题讨论】:

    标签: r dataframe merge reshape string-concatenation


    【解决方案1】:

    使用dplyr你可以试试:

    library(dplyr)
    
    df %>%
     group_by(id1, id2, grp = cumsum(c(TRUE, diff(start_line) > 1))) %>%
     summarise(start_line = first(start_line), 
               end_line = last(end_line), 
               content = paste(content, collapse = " "), 
                merge = any(merge))
    
    
    #  id1   id2     grp start_line end_line content         merge
    #  <chr> <chr> <int>      <int>    <int> <chr>           <lgl>
    #1 A     B         1          1        1 aaaa            TRUE 
    #2 A     B         2          4        6 aa mm boool omw TRUE 
    #3 C     D         2          6        7 hear!  me out!  TRUE 
    #4 C     D         3         21       21 hello           FALSE
    

    数据

    df <- structure(list(id1 = c("A", "A", "A", "A", "C", "C", "C"), id2 = c("B", 
    "B", "B", "B", "D", "D", "D"), start_line = c(1L, 4L, 5L, 6L, 
    6L, 7L, 21L), end_line = c(1L, 4L, 5L, 6L, 6L, 7L, 21L), content = c("aaaa", 
    "aa mm", "boool", "omw", "hear!", " me out!", "hello"), merge = c(TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, FALSE)), class = "data.frame", 
    row.names = c(NA, -7L))
    

    【讨论】:

    • 有效!天才!只是为了记录,我没有意识到我的数据集没有被订购。因此,第一次运行或您的解决方案不起作用。我需要做:`data
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多