簡體   English   中英

如何在 R dplyr 過濾器中實現條件過濾器

[英]How to implement a conditional filter in R dplyr filter

我有以下兩列和 15 行的數據:

data_1 <- structure(list(column_1 = c(120, 130, NA, NA, NA, 130, 182, 130, 
NA, 925, NA, 181, 182, 188, NA), column_2 = c(7, NA, 1, 1, 1, 
3, 7, NA, 1, NA, 1, NA, 1, 1, 1)), row.names = c(NA, -15L), class = c("tbl_df", 
"tbl", "data.frame"))
列_1 column_2
1 120 7
2 130 不適用
3 不適用 1
4 不適用 1
5 不適用 1
6 130 3
7 182 7
8 130 不適用
9 不適用 1
10 925 不適用
11 不適用 1
12 181 不適用
13 182 1
14 188 1
15 不適用 1
  • 通過使用過濾器,我想在 column_1 中保留以下值的觀察結果: NA , 130, 181, 182, 188
  • 此外,我想刪除 column_2 中條目 7 的所有觀察結果

到目前為止,這通過以下代碼起作用:

data_1 %>% filter(is.na(column_1) | column_1 %in% c(130, 181, 182, 188), !column_2 %in% 7)

現在我想添加一個額外的過濾器:如果 column_1 中的值為 130 並且 column_2 中的值為NA ,則刪除觀察值(因此 data_1 中的第 2 行和第 8 行)。 我怎么能這樣做? 實現此條件過濾器的最佳方法是什么? 到目前為止,我已經嘗試了以下命令,但都沒有達到預期的結果:

data_1 %>% filter(is.na(column_1) | column_1 %in% c(130, 181, 182, 188), !column_2 %in% 7) %>% filter(case_when(column_1 == 130 ~ !is.na(column_2)))

此處的結果是僅保留條目 130、3。

data_1 %>% filter(is.na(column_1) | column_1 %in% c(130, 181, 182, 188), !column_2 %in% 7) %>% filter(case_when(column_1 == 130 ~ !is.na(column_2), TRUE ~ is.na(column_2)))

現在剩下兩個條目:130、3 和 181, NA

我還嘗試了以下兩個命令:

data_1 %>% filter(is.na(column_1) | column_1 %in% c(130, 181, 182, 188), !column_2 %in% 7) %>% filter(if (column_2 == 130) !is.na(column_2))
data_1 %>% filter(is.na(column_1) | column_1 %in% c(130, 181, 182, 188), !column_2 %in% 7) %>% {if (column_2 == 130) filter(., !is.na(column_2))}

你在尋找這樣的東西嗎?

library(tidyverse)


data_1 |>
  filter(case_when(
    is.na(column_1) ~ T,
    column_1 == 130 & is.na(column_2 ) ~ F,
    column_2 == 7 ~ F,
    column_1 %in% c(130, 181, 182, 188) ~ T,
    T ~ F
  ))
#> # A tibble: 10 x 2
#>    column_1 column_2
#>       <dbl>    <dbl>
#>  1       NA        1
#>  2       NA        1
#>  3       NA        1
#>  4      130        3
#>  5       NA        1
#>  6       NA        1
#>  7      181       NA
#>  8      182        1
#>  9      188        1
#> 10       NA        1

我剛剛將您的所有條件添加到一個大case_when中。 確保將語句映射到TF ,以便過濾器正常工作。 在這種情況下,當條件映射到T時,您將保留該行,當它為F時,您將刪除該行。

我只會補充說結構(列表())可能在這里不必要的高級,除非它是出於其他原因完成的。 更簡單的是:

data.frame(column_1 = c(120, 130, NA, NA, NA, 130, 182, 130, NA, 925, NA, 181, 182, 188, NA), 
           column_2 = c(7, NA, 1, 1, 1, 3, 7, NA, 1, NA, 1, NA, 1, 1, 1)))

# or

tibble::tibble(column_1 = c(120, 130, NA, NA, NA, 130, 182, 130, NA, 925, NA, 181, 182, 188, NA), 
               column_2 = c(7, NA, 1, 1, 1, 3, 7, NA, 1, NA, 1, NA, 1, 1, 1))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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