基于多个条件的R过滤数据

时间:2019-08-26 20:51:02

标签: r dataframe

我有一个数据框。它的一部分看起来像这样:

 PN       Supplier    Date1    Q_QTY  Price  B_QTY     Date2
1023242    1        6/2/2017    1     9.32    250     7/1/2019
1023242    1        6/2/2017    1     8.81    100     5/3/2017
1023242    1        6/2/2017    1     9.50    200     7/1/2019
1023242    2        ""          1     152.26   1      4/9/2019
1023242    1        ""          0     9.32    250     7/1/2019
1023242    1        ""          0     8.81    100     5/3/2017
1023242    1        ""          0     9.50    200     7/1/2019

PN有很多,每个PN可以由不同的供应商生产。由于某些原因,有一些“重复”记录具有相同的记录,除了“ Date1” (如第一行和第五行)之外,所有列都相同。

我希望输出中仅包含基于相同PN和供应商的Date1列中不包含“”的行,并且也希望包含具有相同PN但供应商不同的行,尽管Date1为“”。

这是我想要的输出,如下所示:

 PN       Supplier    Date1    Q_QTY  Price  B_QTY     Date2
1023242    1        6/2/2017    1     9.32    250     7/1/2019
1023242    1        6/2/2017    1     8.81    100     5/3/2017
1023242    1        6/2/2017    1     9.50    200     7/1/2019
1023242    2        ""          1     152.26   1      4/9/2019

1 个答案:

答案 0 :(得分:2)

我们可以使用distinct

library(dplyr)
df1 %>%
    distinct(PN, Supplier, Price, B_QTY, .keep_all = TRUE)
#   PN Supplier    Date1 Q_QTY  Price B_QTY    Date2
#1 1023242        1 6/2/2017     1   9.32   250 7/1/2019
#2 1023242        1 6/2/2017     1   8.81   100 5/3/2017
#3 1023242        1 6/2/2017     1   9.50   200 7/1/2019
#4 1023242        2              1 152.26     1 4/9/2019

或者使用duplicated中的base R

df1[!duplicated(df1[c(1:2, 5:6)]),]

数据

df1 <- structure(list(PN = c(1023242L, 1023242L, 1023242L, 1023242L, 
1023242L, 1023242L, 1023242L), Supplier = c(1L, 1L, 1L, 2L, 1L, 
1L, 1L), Date1 = c("6/2/2017", "6/2/2017", "6/2/2017", "", "", 
"", ""), Q_QTY = c(1L, 1L, 1L, 1L, 0L, 0L, 0L), Price = c(9.32, 
8.81, 9.5, 152.26, 9.32, 8.81, 9.5), B_QTY = c(250L, 100L, 200L, 
1L, 250L, 100L, 200L), Date2 = c("7/1/2019", "5/3/2017", "7/1/2019", 
"4/9/2019", "7/1/2019", "5/3/2017", "7/1/2019")), 
class = "data.frame", row.names = c(NA, 
-7L))