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

问题描述 投票:0回答:2

我有一个如下数据集:

enter image description here

用于复制数据集的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

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

不幸的是,有些人选择是和否同意他们是否使用产品的问题。我想删除这些个人但仅针对有问题的Product_Name。在该示例中,用户Alex对产品A回答是和否:

enter image description here

我想删除这些人,但我想删除它们仅用于相关产品。在这里,我只想删除产品A的Alex,并将Alex留给产品B.这应该是我希望数据集的样子:

enter image description here

我知道我可以使用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))

除了上述条件,如果一个人使用= 0并使用= 1然后删除它我有一个额外的条件。如果Use = 0并且我们看到同一用户的多个条目,那么我们不会删除观察结果。但是,如果Use = 1并且我们看到同一用户的多个实例,那么我们将其删除。例如,在下图中,我想保留玛丽的观察结果并删除理查德的观察结果。

enter image description here

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

enter image description here

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

enter image description here

r unique data-cleaning
2个回答
3
投票

Original Question

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

Follow-up Question

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

1
投票

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

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倍

© www.soinside.com 2019 - 2024. All rights reserved.