R:组值与多列之间的子集

时间:2018-03-16 11:48:22

标签: r subset

我有这样的df:

> head(dt)

     Ref.     Date1               Date2     Value
 1: 2018146   2018-01-25      2018-02-25    9281.85
 2: 2018146   2018-01-25      2018-04-25    9281.85
 3: 2018150   2018-01-25      2018-02-25    5865.48
 4: 2018150   2018-01-25      2018-04-25    5865.48
 5: 2018306   2018-01-31      2018-03-25    9596.81
 6: 2010306   2018-01-31      2018-05-01    9596.81

我有参考。重复,因为在值Date,Date2和Value中存在一些差异。

我想只保留Ref。所有其他列之间存在差异:

例如:

我想保留这些行:

Ref.     Date1               Date2     Value
2016487   2017-05-01      2017-06-30   -5343.68
2016487   2016-04-29      2016-05-31   -7451.18

我想跳过那些行(只有一列不同而不是全部3行):

  Ref.     Date1       Date2     Value
 2015778 2016-10-27 2016-12-26 -108.01
 2015778 2016-10-27 2016-12-26 -108.00

我试过这样做:

x %>% group_by(Invoice) %>% 
filter(!duplicated(x$Date1)&!duplicated(x$Date2)&!duplicated(x$Value))

但不行。

1 个答案:

答案 0 :(得分:1)

它似乎是一个data.table。按“参考”分组后,unlist数据子集(.SD),if未列出元素的length等于length unique个元素(uniqueN),然后获取Data.table的子集

library(data.table)
dt[, {
        un <- unlist(.SD)
        if(length(un) == uniqueN(un)) .SD
      }, Ref.]

注意:这里我们假设每个'Ref'的所有值都是不同的。即使'Date1'和'Date2'值也不相同。

如果条件是仅检查每列中的唯一值而不是检查所有列

dt[dt[, .I[Reduce(`&`, lapply(.SD, function(x) uniqueN(x) == 1))], Ref.]$V1]

使用dplyr,我们可以使用filter_all

library(dplyr)
dt %>% 
   group_by(Ref.) %>%
   filter_all(all_vars(n_distinct(.) == n()))