Использование select_if с именем переменной и условиями типа - PullRequest
0 голосов
/ 18 декабря 2018

Существует множество сообщений об использовании 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

Тем не менее, я понятия не имею, как это исправить.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Просто для полноты, не уверен, что это приемлемо для вас, но база R может избавить вас от некоторой боли здесь (первый, очень быстрый выстрел):

df[, sapply(names(df), 
  function(coln, df) !grepl("A", coln) && is.factor(df[[coln]]), df = df),
  drop = FALSE]
0 голосов
/ 18 декабря 2018

Возможно, я что-то упускаю, но есть ли причина, по которой вы не можете сделать следующее:

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   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...