[英]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 |
NA
, 130, 181, 182, 188到目前為止,這通過以下代碼起作用:
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
中。 確保將語句映射到T
和F
,以便過濾器正常工作。 在這種情況下,當條件映射到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.