R:根据多列查找重复行,但不删除行

ktecyv1j  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(176)

这个问题可能在其他地方被问到过,但是我尝试过不同的搜索措辞,却无法找到它...我的问题是关于查找重复项,但不删除它们。我找到了一些关于如何删除基于多列的行的示例(例如link1link2),但我希望将它们保留在数据集中,这样行数和顺序就不会改变。
我的数据示例:

shop_code <- c(1, 1, 1, 5, 1, 1, 1, 2, 2, 2, 1, 2, 3, 1)
brand <- c("Renault", "Mazda", "Peugeot", "Renault", "Peugeot", "Volkswagen", "Renault", "Ford", "Renault", "Peugeot", "Renault", "Mazda", "Ford", "Ford")
date <- c("2023-01-04", "2023-01-04", "2023-01-13", "2023-01-04", "2023-01-13", "2020-08-23", "2023-01-18", "2022-04-01", "2021-09-20", "2001-05-02", "2023-01-04", "2023-01-05", "2011-03-30", "2011-03-30")
df <- data.frame(shop_code, brand, date)
revision <- c("1", "", "", "5", "", "", "", "", "", "", "1", "", "3", "1")
df$revision <- revision

表格形式:
| 车间代码|烙印|日期|修正|
| - ------|- ------|- ------|- ------|
| 1个|雷诺|2023年1月4日|1个|
| 1个|马自达|2023年1月4日||
| 1个|标致|2023年1月13日||
| 五个|雷诺|2023年1月4日|五个|
| 1个|标致|2023年1月13日||
| 1个|大众汽车|二○二○年八月二十三日||
| 1个|雷诺|2023年1月18日||
| 第二章|福特|2022年4月1日||
| 第二章|雷诺|二〇二一年九月二十日||
| 第二章|标致|二零零一年五月二日||
| 1个|雷诺|2023年1月4日|1个|
| 第二章|马自达|2023年1月5日||
| 三个|福特|2011年3月30日|三个|
| 1个|福特|2011年3月30日|1个|
我的目标是找到那些在“brand”和“date”列中具有相同值且在“shop_code”中具有不同值的行。当满足此条件时,将在“revision”列中添加一条消息(例如,商店名称)。
请注意,应该检测到2023-01-04的三排Renault,因为其中一排来自不同的商店(商店1和5)。
拜托,有什么主意吗?

bxgwgixi

bxgwgixi1#

library(dplyr)

df %>% 
  group_by(brand, date) %>% 
  mutate(revision = if (n_distinct(shop_code) >= 2) shop_code else NA)
# A tibble: 14 × 4
# Groups:   brand, date [10]
   shop_code brand      date       revision
       <dbl> <chr>      <chr>         <dbl>
 1         1 Renault    2023-01-04        1
 2         1 Mazda      2023-01-04       NA
 3         1 Peugeot    2023-01-13       NA
 4         5 Renault    2023-01-04        5
 5         1 Peugeot    2023-01-13       NA
 6         1 Volkswagen 2020-08-23       NA
 7         1 Renault    2023-01-18       NA
 8         2 Ford       2022-04-01       NA
 9         2 Renault    2021-09-20       NA
10         2 Peugeot    2001-05-02       NA
11         1 Renault    2023-01-04        1
12         2 Mazda      2023-01-05       NA
13         3 Ford       2011-03-30        3
14         1 Ford       2011-03-30        1
ljo96ir5

ljo96ir52#

也许用dplyr

  1. group_by用于分组品牌和日期
  2. n_distinct用于计算不同商店代码的数量
    中间变量可以在DPLYR管的末端除去。
    我在这里展示它们是出于教育目的和更好的概括
df%>%
  group_by(brand,date)%>%
  mutate(n_rows=n())%>%
  mutate(distinct_shop=n_distinct(shop_code))%>%
  mutate(duplicated=n_rows>1 & distinct_shop >1 ) 

# A tibble: 14 × 7
# Groups:   brand, date [10]
   shop_code brand      date       revision n_rows distinct_shop duplicated
       <dbl> <chr>      <chr>      <chr>     <int>         <int> <lgl>     
 1         1 Renault    2023-01-04 "1"           3             2 TRUE      
 2         1 Mazda      2023-01-04 ""            1             1 FALSE     
 3         1 Peugeot    2023-01-13 ""            2             1 FALSE     
 4         5 Renault    2023-01-04 "5"           3             2 TRUE      
 5         1 Peugeot    2023-01-13 ""            2             1 FALSE     
 6         1 Volkswagen 2020-08-23 ""            1             1 FALSE     
 7         1 Renault    2023-01-18 ""            1             1 FALSE     
 8         2 Ford       2022-04-01 ""            1             1 FALSE     
 9         2 Renault    2021-09-20 ""            1             1 FALSE     
10         2 Peugeot    2001-05-02 ""            1             1 FALSE     
11         1 Renault    2023-01-04 "1"           3             2 TRUE      
12         2 Mazda      2023-01-05 ""            1             1 FALSE     
13         3 Ford       2011-03-30 "3"           2             2 TRUE      
14         1 Ford       2011-03-30 "1"           2             2 TRUE

相关问题