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 倍
我有如下数据集:
用于复制数据集的 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 倍