自动将二进制变量编码为因子?

Fan*_*oué 2 boolean r r-factor

我有一个问题:是否有 R 函数可以自动将二进制变量编码为因子?

我有一个包含超过 80 个变量(列)的 tibble,其中许多变量具有布尔性质(0、1 和 NA),R 作为numeric导入。由于我想避免手动将它们转换为Factor,我想知道是否有一个函数能够自动检测a (或 a ) 中的二进制数值变量并将它们更改为 Factor ?我可以自己创建这样的函数,但如果它已经存在,为什么还要麻烦呢?data.frametibble

G. *_*eck 5

下面我们假设一列被视为二进制只要

  • 这并不全是不适用的
  • 除了 NA 之外,它仅由数字 0 和 1 值组成。

请注意,完全为 0 和 NA 或完全为 1 和 NA 的列被视为二进制,但如果这是不可取的,我们将展示如何更改代码以要求二进制列同时具有 0 和 1。

首先定义一个函数is_binary,定义一列是否被视为二进制。如果你想改变二进制的定义,可以改变这个函数。特别是,如果一列必须同时包含 0 和 1 才能将其视为二进制,请将下面代码中的 1:2 更改为 2。如果需要,其他定义也是可能的。

接下来应用于is_binary返回逻辑向量的每一列ok,每列一个分量,如果该列是二进制,则为 TRUE,否则为 FALSE。

在计算答案的行中,DF2我们factor使用参数应用于每个二进制列levels = 0:1,以确保只有 0 或只有 1 的列仍然具有两个级别。

没有使用任何包。

DF <- data.frame(a = c(0:1, NA), b = 1:3, c = NA, d = 0) # test data frame

is_binary <- function(x) {
  x0 <- na.omit(x)
  is.numeric(x) && length(unique(x0)) %in% 1:2 && all(x0 %in% 0:1)
}
ok <- sapply(DF, is_binary)
DF2 <- replace(DF, ok, lapply(DF[ok], factor, levels = 0:1))

str(DF2)
## 'data.frame':   3 obs. of  4 variables:
##  $ a: Factor w/ 2 levels "0","1": 1 2 NA
##  $ b: int  1 2 3
##  $ c: logi  NA NA NA
##  $ d: Factor w/ 2 levels "0","1": 1 1 1
Run Code Online (Sandbox Code Playgroud)

我们可以交替使用 dplyr ,is_binary如下所示:

DF %>% mutate(across(where(is_binary), ~ factor(., levels = 0:1)))
Run Code Online (Sandbox Code Playgroud)