我正在尝试编写一个函数,该函数将返回数据帧中所有二进制变量的索引,但预定义变量或提供的变量列表除外。您可以通过以下方式生成示例数据:
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值。我知道有一个解决此问题的简单方法
答案 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