我有一个问题:是否有 R 函数可以自动将二进制变量编码为因子?
我有超过 80 个变量(列),其中许多是 boolean 性质的(0、1 和 NA),R 作为数字导入。因为我想避免将它们手动转换为因子,所以我想知道是否有一个函数能够自动检测 data.frame
中的二进制数值变量 (或 tibble
)并将它们转换为因子?我可以自己创建这样一个函数,但如果它已经存在,何必呢?
最佳答案
下面我们假设一个列只要是二元的就认为是
- 它不全是 NA 并且
- 除了 NA 之外,它仅由数字 0 和 1 值组成。
请注意,完全为 0 和 NA 或完全为 1 和 NA 的列被视为二进制,但如果这是不希望的,我们将展示如何更改代码以要求二进制列同时具有 0 和 1。
首先定义一个函数is_binary
,定义一个列是否被认为是二进制的。如果你想改变二进制的定义,这个函数可以改变。如果一列必须同时具有 0 和 1 才能将其视为二进制,请特别将下面代码中的 1:2 更改为 2。如果需要,其他定义也是可能的。
接下来将 is_binary
应用于每一列,返回一个逻辑向量 ok
,如果该列是二进制的,则每列一个分量为 TRUE,否则为 FALSE。
在计算答案 DF2
的行中,我们使用参数 levels = 0:1
将 factor
应用于每个二进制列,以确保列只有 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
我们可以像这样交替使用 dplyr 和 is_binary
:
DF %>% mutate(across(where(is_binary), ~ factor(., levels = 0:1)))
关于r - 自动将二进制变量编码为因子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65026376/