[英]R - Concatenate cell in dataframe, by group, depending on another cell value
I have a dataset of the following type (first row is the header):我有以下类型的数据集(第一行是标题):
content
is always text content
始终是文本merge
is always a logical 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
Problem: I need to merge following a very specific criteria:问题:我需要按照一个非常具体的标准进行合并:
merge = FALSE
must remain as ismerge = FALSE
的行必须保持原样id1
, same id2
and consecutive start_line
:id1
、相同id2
和连续start_line
的行:
content
content
上end_line
value needs to change to the last row end_line
值需要更改为最后一行So, the expected result would be:所以,预期的结果是:
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
Notice in the example that:请注意示例中的:
I have attempted a very large, and inefficient series of loops, that only merge two lines.我尝试了一个非常大且效率低下的循环系列,只合并两行。 That is why I am not posting my attempt here.
这就是为什么我没有在这里发布我的尝试。
Using dplyr
you can try:使用
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
data数据
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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.