r - R - 按组连接数据框中的单元格,具体取决于另一个单元格值
问题描述
我有以下类型的数据集(第一行是标题):
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 示例:CD,最初是第 6 行和第 7 行)
- 可以合并多行(ids AB 的示例,最初是第 2、3、4 行)
我尝试了一个非常大且效率低下的循环系列,只合并两行。这就是为什么我没有在这里发布我的尝试。
解决方案
使用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))
推荐阅读
- sql-server - SQL Server 对相同的日期选择查询返回不同的结果,在不同的场景中
- python - 如果字符串包含逗号,则拆分字符串,否则使用列表理解返回字符串
- ef-code-first - EF Core 为导航创建 2 列
- testing - 为什么消费者驱动的合同测试不起作用?
- javascript - 我如何将 Json 数据发布到我的状态 ReactJs
- python - python multiprocessing 创建一个带有多张工作表的excel文件
- android - 使用另一个片段膨胀类片段重复 ID、标记 null 或父 ID 时出错
- javascript - 对象序列化问题
- sql - 从 varchar 转换日期和/或时间
- netbeans-platform - 我想在两个日期之间从 mysql 表中查询数据