R:在组内,基于多个条件保留条目

56lgkhnf  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(104)

我有一个表格,如下所示:
| 标题|全名|身份证|
| --------------|--------------|--------------|
| 布鲁布鲁|一些标题|dk29D|
| 布拉布拉|标题blabla 1|dRAQx|
| 布拉布拉|标题blabla 1|Yprst|
| 布拉布拉|标题blabla 2|dRAQx|
| 布拉布拉|标题blabla 2|Yprst|
| 点子|其他标题|qW45m|
该表最终应如下所示:
| 标题|全名|身份证|
| --------------|--------------|--------------|
| 布鲁布鲁|一些标题|dk29D|
| 布拉布拉|标题blabla 1|dRAQx|
| 布拉布拉|标题blabla 2|Yprst|
| 点子|其他标题|qW45m|
因此,我不关心blabla 1是否与dRAQx或Yprst相关联(blabla 2也是如此)。关键是要维护一个title示例和一个id示例。

sampledata <- data.frame(
  title = c("blublu", rep("blabla", 4), "pips"),
  full_name = c("some title", rep("title blabla1", 2), rep("title blabla2", 2), "some other title"),
  id = c("dk29D", rep(c("dRAQx","Yprst"), 2), "qW45m")
)

我试过很多方法,但最好的结果是:

sampledata %>% 
      group_by(title) %>% 
      mutate(id = sample(id, length(id), replace = FALSE)) %>%
      distinct(full_name, .keep_all = TRUE) %>%
      mutate(same_id = any(duplicated(id)))

这里的问题是它是随机的,有时保留的ID是相同的(由same_id变量跟踪)。
我希望我的问题可以理解。
我很期待你们的回复。先谢谢你们。

dsekswqp

dsekswqp1#

我们可以这样做:
技巧是使用full_name中的数字作为应该过滤的row_number:

library(dplyr)
library(parse_number)

sampledata %>%  
  group_by(title, full_name) %>% 
  mutate(x = coalesce(parse_number(full_name), 1)) %>% 
  filter(x == row_number()) %>% 
  ungroup() %>% 
  select(-x)
title  full_name        id   
  <chr>  <chr>            <chr>
1 blublu some title       dk29D
2 blabla title blabla1    dRAQx
3 blabla title blabla2    Yprst
4 pips   some other title qW45m
Warning message:
There were 2 warnings in `mutate()`.
The first warning was:
ℹ In argument: `x = coalesce(parse_number(full_name), 1)`.
ℹ In group 3: `title = "blublu"`, `full_name = "some title"`.
Caused by warning:
! 1 parsing failure.
row col expected     actual
  1  -- a number some title
ℹ Run dplyr::last_dplyr_warnings() to see the 1 remaining warning.

相关问题