我有一个如下数据集:
复制数据集的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回答是和否:左
我想删除此类个人,但我想仅删除相关产品。在这里,我只想删除产品A的Alex,并将Alex留给产品B.这应该是我希望数据集的样子:
我知道我可以使用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并且我们看到同一用户的多个实例,那么我们将其删除。例如,在下图中,我想保留玛丽的观察结果并删除理查德的观察结果。
我想得到的最终输出看起来像这样:
在此图中,请注意我不想删除Mary,因为对于两个实例Use = 0。但是,由于理查德使用= 1,我想删除他的观察结果。
答案 0 :(得分:3)
library(dplyr)
mydata %>%
group_by(Product_Name, Name) %>%
filter(length(Use) == 1)
library(dplyr)
mydata %>%
group_by(Product_Name, Name) %>%
filter(length(Use) == 1 | (Use == 0 & n_distinct(Use) == 1))
答案 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倍