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

时间:2019-06-03 17:31:23

标签: r data-cleaning sapply

我正在尝试编写一个函数,该函数将返回数据帧中所有二进制变量的索引,但预定义变量或提供的变量列表除外。您可以通过以下方式生成示例数据:

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)

以及所有未使用以下名称的变量的列表:

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

但是我正在寻找的输出将忽略预定义的列或列列表,并且将返回与您将得到的输出相同的输出:

names(data)=="BINARY"

我认为使用sapply函数内部的两个条件,但是sapply内部的names(x)返回NULL值。我知道有一个解决此问题的简单方法

2 个答案:

答案 0 :(得分:1)

## 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

答案 1 :(得分:0)

我们可以使用Map中的base 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