[英]filter duplicated rows that has nonmatching variable values .in R
我正在嘗試過濾一些重復的行,我需要過濾不匹配的重復項。
這是示例數據集。
df <- data.frame(
id = c(1,2,2,3,4,5,5,6),
cat = c(3,3,4,5,2,2,1,5),
actual.cat = c(3,4,4,5,2,1,1,7))
> df
id cat actual.cat
1 1 3 3
2 2 3 4
3 2 4 4
4 3 5 5
5 4 2 2
6 5 2 1
7 5 1 1
8 6 5 7
所以,每個 id 都有cat
和actual.cat
。 當有重復的id
,我需要過濾不匹配的行。
這里有我需要的。
> df
id cat actual.cat
1 3 3
2 3 4
3 5 5
4 2 2
5 2 1
6 5 7
對此有何想法?
謝謝!
我們可以通過操作和filter
進行分組
library(dplyr)
df %>%
group_by(id) %>%
filter(n() > 1 & cat != actual.cat|n() == 1)
-輸出
# A tibble: 6 x 3
# Groups: id [6]
# id cat actual.cat
# <dbl> <dbl> <dbl>
#1 1 3 3
#2 2 3 4
#3 3 5 5
#4 4 2 2
#5 5 2 1
#6 6 5 7
或使用base R
subset(df, id %in% names(which(table(id) > 1)) &
cat != actual.cat| id %in% names(which(table(id) == 1)))
在基礎 R 中,您可以使用帶有ave
subset
來選擇每個id
中的行,其中每組中的行數為 1 或cat
不等於actual.cat
。
subset(df, ave(cat != actual.cat, id, FUN = function(x) length(x) == 1 | x))
# id cat actual.cat
#1 1 3 3
#2 2 3 4
#4 3 5 5
#5 4 2 2
#6 5 2 1
#8 6 5 7
您還可以在data.table
編寫此邏輯:
library(data.table)
setDT(df)[, .SD[.N == 1 | cat != actual.cat], id]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.