我有这样的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))
但不行。
答案 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()))