根据因子变量删除 R 中的重复行

Removing duplicate rows in R based upon a factor variable

我正在尝试根据因子变量的存在删除重复的行。如果重复行中的因子变量显示 desired,而不是 not desired,我想保留该行并删除另一行。所需的因子有时会出现在第一个副本中,有时会出现在第二个副本中。

此外,有一个列从三十天开始计算,一旦需要或不需要弹出。在没有类型(NA)的情况下,duplicate flag 列也会显示 NA。

最后,每个品牌每天应该有 1 行。

手头的数据样本:

brand    date      sales orders customers   type        duplicate_flag
A     10/1/2018    100    5       4         NA                 NA
A     10/2/2018    150    8       6        desired             1
A     10/2/2018    150    8       6        not desired         1
A     10/3/2018    110    5       4          NA                2

期望的输出:

brand    date      sales orders customers   type        duplicate_flag
A     10/1/2018    100    5       4         NA                 NA
A     10/2/2018    150    8       6        desired             1
A     10/3/2018    110    5       4          NA                2

如果有办法在 dplyr 中做到这一点,那就太好了。

谢谢!

我假设你的数据框是 "df"

df %>% filter(type != "not desired" | is.na(type))

或者

df %>% select(-type) %>% distinct()

这里有一些可用的示例数据。

df <-
  data_frame(
    Date = c(1,2,2,3,3,4)
    , Metric = 1:6
    , type = c(NA, "desired", "not desired", "not desired", "desired", "not desired")
  )

看起来像:

# A tibble: 6 x 3
   Date Metric type       
  <dbl>  <int> <chr>      
1     1      1 <NA>       
2     2      2 desired    
3     2      3 not desired
4     3      4 not desired
5     3      5 desired    
6     4      6 not desired

我假设您希望基于 type 列,每个日期保留一行,但其他列可能(或可能不)彼此不同。 (如果它们彼此之间没有区别,我不明白为什么保留哪一行很重要。)

为此,最简单的方法可能是按 type 对数据进行排序(确保要保留的值排在第一位——您可能必须将 type 更改为具有"desired" 值作为第一级(如果由于某种原因它不是按字母顺序排列的第一级)然后使用 slice 保留第一个条目。

df %>%
  arrange(type) %>%
  group_by(Date) %>%
  slice(1) %>%
  ungroup() %>%
  arrange(Date)

returns:

# A tibble: 4 x 3
   Date Metric type       
  <dbl>  <int> <chr>      
1     1      1 <NA>       
2     2      2 desired    
3     3      5 desired    
4     4      6 not desired