Есть много сообщений об использовании dplyr select_if
для различных условий. Однако каким бы то ни было образом выбор как для is.factor
, так и для имен переменных у меня пока не сработал.
В конечном итоге я хотел бы выбрать все факторы в df / tibble и исключить определенные переменные по имени.
Пример:
df <- tibble(A = factor(c(0,1,0,1)),
B = factor(c("Yes","No","Yes","No")),
C = c(1,2,3,4))
Различные попытки:
Попытка 1
df %>%
select_if (function(col) is.factor(col) & !str_detect(names(col), "A"))
Error in selected[[i]] <- .p(.tbl[[tibble_vars[[i]]]], ...) : replacement has length zero
Попытка 2
df %>%
select_if (function(col) is.factor(col) & negate(str_detect(names(col)), "A"))
Error: Can't convert a logical vector to function Call `rlang::last_error()` to see a backtrace
Попытка 3
df %>%
select_if (function(col) is.factor(col) && !str_detect(names(col), "A"))
Error: Only strings can be converted to symbols Call `rlang::last_error()` to see a backtrace
Попытка 4
df %>%
select_if (is.factor(.) && !str_detect(names(.), "A"))
Error in tbl_if_vars(.tbl, .predicate, caller_env(), .include_group_vars = TRUE) : length(.p) == length(tibble_vars) is not TRUE
Между тем, без проблем работают индивидуальные условия:
> df %>%
+ select_if (is.factor)
# A tibble: 4 x 2
A B
<fct> <fct>
1 0 Yes
2 1 No
3 0 Yes
4 1 No
> df %>%
+ select_if (!str_detect(names(.), "A"))
# A tibble: 4 x 2
B c
<fct> <dbl>
1 Yes 1
2 No 2
3 Yes 3
4 No 4
Проблема, вероятно, здесь:
df %>%
select_if (function(col) !str_detect(names(col), "A"))
Error in selected[[i]] <- .p(.tbl[[tibble_vars[[i]]]], ...) : replacement has length zero
Однако я мало понимаю, как это исправить.
Не думаю, что с этот вопрос / ответ что-то изменилось. Также см. это.
Я пробовал решения в упомянутых вами сообщениях, но, похоже, они не работают для этой конкретной проблемы. Не знаю почему.
Возможно, я что-то упускаю, но есть ли причина, по которой вы не могли сделать следующее:
df <- tibble(A = factor(c(0,1,0,1)),
B = factor(c("Yes","No","Yes","No")),
C = c(1,2,3,4))
df %>% select_if (function(col) is.factor(col)) %>% select_if (!str_detect(names(.), "A"))
# A tibble: 4 x 1
B
<fct>
1 Yes
2 No
3 Yes
4 No
Да, это действительно очевидное решение. Однако я надеялся сжать его одним оператором select_if
. Это связано с тем, что знание того, как это сделать, также будет полезно для summarise_if
, для которого предлагаемое вами решение может быть более неудобным.
Просто для полноты, не уверен, приемлемо ли это для вас, но базовый R может избавить вас от боли здесь (первый, очень быстрый снимок):
df[, sapply(names(df),
function(coln, df) !grepl("A", coln) && is.factor(df[[coln]]), df = df),
drop = FALSE]
Используйте оператор%>%: df%>% dplyr :: select_if (is.factor)%>% dplyr :: select (-one_of ('A'))