合并不完整的重复行

时间:2019-11-30 16:02:01

标签: r dplyr duplicates

我有一个不完整重复的df。重复项基于2列(日期和公司名称),此后数据有所不同。我想做的是“掷硬币”并保留2个重复项之一,因为没有办法验证哪个正确。

我曾经考虑过通过日期和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

1 个答案:

答案 0 :(得分:0)

如果要在按“日期”,“公司名称”分组后sample行,可以在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)