【问题标题】:R remove duplicates completely across different groupsR在不同组中完全删除重复项
【发布时间】:2018-03-01 17:48:07
【问题描述】:

我有一个如下数据集:

复制数据集的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 = 是,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,我想删除他的观察结果。

【问题讨论】:

  • 您应该研究按变量分组。例如,您可以使用 dplyr:group_by(mydata, Name, Product_Name) %&gt;% filter(n() == 1)
  • mydata[with(mydata, ave(Use, Name, Product_Name)) %in% 0:1, ]

标签: r unique data-cleaning


【解决方案1】:

原始问题

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))

【讨论】:

  • 我有一个后续问题。假设我想再添加一个条件。假设 Product_Name - B ,我们有两个正在使用的 Alex 条目 = 0。在这种情况下,我想保留这两种情况。但是,如果我们观察到 Use = 1 两次或更多,那么我想删除它。你知道在这种情况下我需要做什么吗?我将编辑我的原始问题,以便更容易理解我的意思。再次感谢@blondeclover
  • 工作就像一个魅力。你太棒了。 @金发三叶草
【解决方案2】:

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

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 倍左右

【讨论】:

    猜你喜欢
    • 2017-09-16
    • 2022-01-12
    • 2021-06-01
    • 2018-09-18
    • 2016-01-04
    • 2014-03-10
    • 1970-01-01
    • 2020-11-09
    • 2020-11-29
    相关资源
    最近更新 更多