используя if в filter_at () - PullRequest
       4

используя if в filter_at ()

1 голос
/ 22 января 2020

ДАННЫЕ

df <- structure(list(ID = c("51-07519", "51-07522", "51-07525", "51-07526", 
    "51-07527", "51-07530"), name = c("Fyb", "Fyb", "Fyb", "Fyb", 
    "Fyb", "Fyb"), serology_charts = c(0L, 0L, NA, 0L, 1L, 1L), antibodies_chart = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
    ), bioarray_charts = c(NA, 0L, NA, 0L, NA, NA), others_charts = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
    ), Fyb = c(1, 1, 1, 1, 1, 1), GATAfactor = c(0, 0, 1, 0, 0.5, 
    0.5)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
    ))

В настоящее время я запускаю следующий фильтр:

df%>% 
     filter_at(vars(ends_with("charts")), any_vars(!is.na(.) & . != Fyb*GATAfactor))

Можно ли написать оператор if следующим образом:

if Fyb!=1  {filter_at(vars(ends_with("charts")), any_vars(!is.na(.) & . != Fyb))}
else       {filter_at(vars(ends_with("charts")), any_vars(!is.na(.) & . != Fyb*GATAfactor))}

1 Ответ

1 голос
/ 22 января 2020

Мы можем обернуть условие в case_when или ifelse

library(dplyr)
df %>%
  filter_at(vars(ends_with("charts")),
      any_vars(case_when(Fyb == 1 ~  !is.na(.) & . != Fyb*GATAfactor, 
      TRUE ~ !is.na(.) & . != Fyb)))

Или используя ifelse

df %>%
    filter_at(vars(ends_with("charts")),
       any_vars(ifelse(Fyb == 1, !is.na(.) & . != Fyb*GATAfactor, !is.na(.) & . != Fyb)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...