首页 > 解决方案 > 合并不完整的重复行

问题描述

我有一个不完整重复的 df。重复项基于 2 列(日期和 co.name),之后数据不同。我想做的是“掷硬币”并保留两个副本中的一个,因为无法验证哪个是正确的。

我想过按日期和 co.name 对数据框进行子集化,然后将其合并回原来的,只保留一侧,但想知道是否有更好的方法

dates <- c(rep("2019-06-17", 2), rep("2016-01-11", 2), rep("2016-04-11",2), '2016-04-12', '2016-04-12')
co.name <- c(rep("co1", 2), rep("co2", 2), rep("co1",2), 'co1', 'co2')
total <- c(10,10,15,12,10,9,12,14)
new.products <- c(3,0,4,0,2,0,1,4)
df <-data.frame(dates, co.name, total, new.products)

df
       dates co.name total new.products
1 2019-06-17     co1    10            3
2 2019-06-17     co1    10            0
3 2016-01-11     co2    15            4
4 2016-01-11     co2    12            0
5 2016-04-11     co1    10            2
6 2016-04-11     co1     9            0
7 2016-04-12     co1    12            1
8 2016-04-12     co2    14            4   



df %>%
  group_by(co.name, dates) %>%
  filter(n() == 2)

# A tibble: 6 x 4
# Groups:   co.name, dates [3]
  dates      co.name total new.products
  <fct>      <fct>   <dbl>        <dbl>
1 2019-06-17 co1        10            3
2 2019-06-17 co1        10            0
3 2016-01-11 co2        15            4
4 2016-01-11 co2        12            0
5 2016-04-11 co1        10            2
6 2016-04-11 co1         9            0

预期输出:

# A tibble: 5 x 4
  dates      co.name total new.products
  <fct>      <fct>   <dbl>        <dbl>
1 2019-06-17 co1        10            0
2 2016-01-11 co2        12            0
3 2016-04-11 co1         9            0
4 2016-04-11 co1        10            2
5 2016-04-11 co1         9            0

或者

# A tibble: 5 x 4
  dates      co.name total new.products
  <fct>      <fct>   <dbl>        <dbl>
1 2019-06-17 co1        10            3
2 2016-01-11 co2        15            4
3 2016-04-11 co1        10            2
4 2016-04-11 co1        10            2
5 2016-04-11 co1         9            0

标签: rdplyrduplicates

解决方案


如果我们想sample在按 'dates'、'co.name' 分组后的一行,我们可以在slice

library(dplyr)
df %>%
   group_by(dates, co.name) %>% 
   slice(sample(row_number(), 1))

或与sample_n

df %>% 
   group_by(dates, co.name) %>% 
   sample_n(1)

推荐阅读