如何在 dplyr 管道语句中仅保留每组最完整的信息行?

问题描述 投票:0回答:1

我有一个输入数据集,其中每组(即

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
r dplyr
1个回答
1
投票

我不清楚决定什么是最完整行的算法。这是基于帖子中的解释和共享示例的尝试。

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
的所有内容。

© www.soinside.com 2019 - 2024. All rights reserved.