我有一个输入数据集,其中每组(即
info
)在几行中具有部分冗余信息(即ID
)。某些组的某些行更完整(即包含额外的 _detail
信息),而某些组也从未拥有完整信息。我想保留每个ID
组和信息类型最完整的信息行,并丢弃其他信息行。另外,我希望能够在没有中间变量的单个 dplyr
管道中执行此操作。
输入示例:
data.frame(ID = c(1, 1, 1, 2, 3, 3, 3, 3),
info = c("info1#info1_detail", "info1", "info3",
"info1",
"info1#info1_detail", "info1",
"info2#info2_detail", "info2"))
#> ID info
#> 1 1 info1#info1_detail
#> 2 1 info1
#> 3 1 info3
#> 4 2 info1
#> 5 3 info1#info1_detail
#> 6 3 info1
#> 7 3 info2#info2_detail
#> 8 3 info2
所需的输出示例:
data.frame(ID = c(1, 1, 2, 3, 3),
info = c("info1#info1_detail",
"info3",
"info1",
"info1#info1_detail",
"info2#info2_detail"))
#> ID info
#> 1 1 info1#info1_detail
#> 2 1 info3
#> 3 2 info1
#> 4 3 info1#info1_detail
#> 5 3 info2#info2_detail
我不清楚决定什么是最完整行的算法。这是基于帖子中的解释和共享示例的尝试。
library(dplyr)
most_complete_row <- function(str) {
lgl <- grepl('_detail', str)
if(any(lgl)) lgl else TRUE
}
df %>% filter(most_complete_row(info), .by = ID)
# ID info
#1 1 info1#info1_detail
#2 2 info1
#3 3 info1#info1_detail
#4 3 info2#info2_detail
基本上,这会返回其中包含“_detail”的行,否则返回特定
ID
的所有内容。