簡體   English   中英

過濾具有不匹配變量值的重復行 .in R

[英]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 都有catactual.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM