R完全删除不同组的重复项

R remove duplicates completely across different groups

我有如下数据集:

用于复制数据集的 R 代码:

mydata <- data.frame(Name =c('Alex','Brenda','Carl','Alex','Daniel',
'Einstein','Frodo','Alex','Brenda','Carl','Einstein','Frodo'),
 Product_Name = c('A','A','A','A','A','A','A','B','B','B','B','B'), 
Use = c(0,0,0,1,1,1,1,0,0,1,1,1))
mydata

这是来自产品使用调查的数据集。 Name包含用户名,Product_Name是产品名称(Product A或Product B。在真实数据集中,有2个以上),Use包含用户是否使用该产品的信息(1 = yes , 0 = 否).

不幸的是,有些人对有关他们是否使用某种产品的问题同时选择了是和否。我想删除这些人,但仅限于有问题的 Product_Name。在示例中,用户 Alex 对产品 A 的回答是和否:

我想删除这些人,但我只想为相关产品删除他们。在这里,我只想为产品 A 删除 Alex,为产品 B 保留 Alex。这应该是我希望数据集的样子:

我知道我可以使用 R 中的唯一包删除重复项 (https://stat.ethz.ch/R-manual/R-devel/library/base/html/unique.html),但这仍然会在产品 1 中留下一个 Alex 的案例。我还想将对唯一名称的搜索限制在每个 Product_Name(即只有产品 A 或产品 B 等等)。任何帮助将不胜感激。

如果问题不是很清楚,请告诉我。提前致谢。

跟进问题

现在假设我们有以下场景:

mydata <- data.frame(Name =c('Alex','Brenda','Carl','Alex','Daniel',
'Einstein','Frodo','Alex','Brenda','Carl','Einstein','Frodo',
'Mary','Mary','Richard','Richard'),
 Product_Name = c('A','A','A','A','A','A','A','B','B','B','B',
 'B','C','C','C','C'), 
Use = c(0,0,0,1,1,1,1,0,0,1,1,1,0,0,1,1))

除了上述条件,如果一个人有 use =0 和 use = 1 然后他们被删除,我还有一个额外的条件。如果 Use = 0 并且我们看到同一用户的多个条目,那么我们不会删除观察结果。但是,如果 Use = 1 并且我们看到同一用户的多个实例,那么我们将删除它们。例如,在下图中,我想保留 Mary 的观察结果并删除 Richard 的观察结果。

我想要得到的最终输出看起来像这样:

在此图中,请注意我不想删除 Mary,因为对于这两个实例都使用 =0。但是,由于 Richard 的 Use = 1,我想删除他的观察结果。

原问题

library(dplyr)
mydata %>%
        group_by(Product_Name, Name) %>%
        filter(length(Use) == 1)

Follow-up问题

library(dplyr)
mydata %>%
        group_by(Product_Name, Name) %>%
        filter(length(Use) == 1 | (Use == 0 & n_distinct(Use) == 1))

如果您想依赖基数 R,可以使用 aggregate 来计算每个 (Name - Product_Name) 组合出现的次数。然后创建一个黑名单以从 mydata:

中删除该黑名单上的所有 (Name - Product_Name)-组合
inter     <- aggregate(df, by=list(df$Name, df$Product_Name), FUN="length")
blacklist <- inter[c('Group.1', 'Group.2')][inter$Name > 1, ]
for(i in nrow(blacklist)){
  r  <- blacklist[i, ]
  df <- df[!(df$Name == r[[1]] & df$Product_Name == r[[2]]), ]
}

我必须承认 dplyr 的答案要好大约 10 倍