R 使用带有变量名称和类型条件的select_if

R 使用带有变量名称和类型条件的select_if,r,dplyr,R,Dplyr,关于使用dplyr的select_if处理多种情况的帖子很多。然而,无论以何种方式,选择都是.factor和变量名迄今为止对我来说都不起作用 最后,我想选择df/TIBLE中的所有因素,并按名称排除某些变量 例如: df <- tibble(A = factor(c(0,1,0,1)), B = factor(c("Yes","No","Yes","No")), C = c(1,2,3,4)) 尝试3 df %>% sel

关于使用dplyr的
select_if
处理多种情况的帖子很多。然而,无论以何种方式,选择
都是.factor
和变量名迄今为止对我来说都不起作用

最后,我想选择df/TIBLE中的所有因素,并按名称排除某些变量

例如:

df <- tibble(A = factor(c(0,1,0,1)), 
             B = factor(c("Yes","No","Yes","No")), 
             C = c(1,2,3,4))
尝试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%>%
+选择_如果(是系数)
#一个tibble:4x2
A B
10是的
2 1号
30是的
4.1不
>df%>%
+如果(!str_detect(名称(.),“A”),请选择
#一个tibble:4x2
B c
1是的1
2号2号
3是3
4号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%>%
选择“如果”(函数(列)!str_detect(名称(列),“A”))

所选[[i]]中出现错误可能我遗漏了某些内容,但是否有任何原因导致您无法执行以下操作:

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   
df%select_if(函数(列)为.factor(列))%%>%select_if(!str_detect(名称(.),“A”))
#一个tibble:4x1
B
1是的
2号
3是的
4号

仅为完整起见,不确定您是否可以接受,但base R可能会为您省去一些麻烦(第一步,非常快速):


使用%>%operator:df%>%dplyr::select_如果(is.factor)%%>%dplyr::select(-one_of('A')),我认为此后一切都没有改变。我在你提到的帖子中尝试了这些解决方案,但它们似乎对这个问题不起作用。我不知道为什么。是的,这确实是一个显而易见的解决办法。然而,我希望将其压缩到一个
select\u if
语句中。这是因为知道如何这样做也有助于
总结\u if
,因为您提出的解决方案可能会更尴尬。
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   
df[, sapply(names(df), 
  function(coln, df) !grepl("A", coln) && is.factor(df[[coln]]), df = df),
  drop = FALSE]