return 没有预定义名称的所有因子变量的索引

return index of all factor variables that don't have a predefined name

我正在尝试编写一个函数,它将 return 数据框中所有二进制变量的索引,预定义变量或提供的变量列表除外。你可以用这个生成示例数据:

data<-data.frame("RESPONSE" = sample(c("YES","NO"),100,replace = T),
             "FACTOR" = sample(c("YES","NO","MAYBE"),100,replace = T),
             "BINARY" = sample(c("YES","NO"),100,replace = T),
             "NUMERIC" = sample(1:100,100,replace = T))

在这种情况下,要忽略的预定义变量是 "RESPONSE"

response.variable.name<-"RESPONSE"

我可以使用以下方法获取所有二进制变量的列表:

sapply(data,function(x) nlevels(as.factor(x))==2)

和所有未命名的变量列表 "RESPONSE" 使用:

!names(data) %in% response.variable.name

但我正在寻找的输出忽略了预定义的列或列列表,并且 return 与您将获得的输出相同:

names(data)=="BINARY"

我想在 sapply 函数中使用两个条件,但在 sapply returns NULL 值中使用 names(x)。我知道这个问题有一个简单的解决方法

我们可以使用 Mapbase R

unlist(Map(function(x, y) nlevels(factor(x)) == 2 &
       y != response.variable.name, data, names(data)))
#  RESPONSE   FACTOR   BINARY  NUMERIC 
#   FALSE    FALSE     TRUE    FALSE 

或使用imap

library(tidyverse)
data %>% 
   imap_lgl(~ nlevels(.x) == 2 & .y != response.variable.name)
#  RESPONSE   FACTOR   BINARY  NUMERIC 
#   FALSE    FALSE     TRUE    FALSE 
## Desired result?
names(data)=="BINARY"
# [1] FALSE FALSE  TRUE FALSE

## Desired method
response.variable.name<-"RESPONSE"
sapply(data,function(x) nlevels(as.factor(x))==2) & !names(data) %in% response.variable.name
# RESPONSE   FACTOR   BINARY  NUMERIC 
#    FALSE    FALSE     TRUE    FALSE 
## same values, has names too (bonus!)
## wrap in `unname()` if you don't like names