R:将多个二进制列转换为一个因子变量,其因子是二进制列

R: Converting multiple binary columns into one factor variable whose factors are binary columns

我得到了一个可怕的数据集,我正在努力清理它:272 个(字符)变量和 343 个观察值。它由许多二元变量组成,这些变量可以归纳为具有多个因素的一个变量。所以与其问“你是个体经营者还是受雇者?”给定选项 1“自雇”、2“受雇”和 3“none/other”,该集合有两个变量:v1.selfemployed 和 v2.employed,选项 1“是”和2“不”。

我现在需要将几个二进制变量合并为一个。由于它们是字符,我需要将它们转换为因数,我这样做了(参见示例)。

### datasetdataset
v1 <- as.character(c("yes", "yes", "no", "yes", "yes", "no", "yes","no", "no", NA ))
v2 <- as.character(c("no","no","no","no","no","yes","no","yes", "no", NA))
v3 <- as.character(c("no","no", "yes", "no","no","no","no","no", "yes", NA))

df <- data.frame(v1,v2,v3)
library(tidyverse)

## dataframe -> tibble
df.t <- as_tibble(df)

## convert into 1/0 factor
df.t %>%
  mutate_if(is.character, as.factor) %>% 
  mutate_at(vars(1:3), ~fct_recode(., "1" = "yes", 
                                          "0" = "no"))

我选择这条路线是因为我有许多二进制“包”,我需要能够通过 vars() select。转换所有必要的包后,我将它们保存在一个新的 data.frame 中,因为我不确定是否使用 tibbles。 我的目标是让变量 v.combined 具有因子水平 v1、v2 和 v3

这个确切的问题已在 8 年前发布 in this thread。我尝试了他们提到的方法,但它们似乎不起作用。他们可能“过时”了?我最终要么得到比以前更多的观察结果——这很有趣——要么得到错误。在 8 年的时间里,在开发 R 的过程中一定发生了一些事情,这可能会使这个过程变得更容易。

谢谢大家的帮助!

我猜您想恢复变量的“one-hot 编码”。这是一个快速的方法。

apply(df ,1,\(x) names(which(x == "yes"))) |>
  purrr::map_chr(~ifelse(length(.x) == 0, NA_character_, .x))

#+  [1] "v1" "v1" "v3" "v1" "v1" "v2" "v1" "v2" "v3" NA  

tidyverse 方法是:

df |>
  mutate(ID = row_number()) |>
  pivot_longer(cols = c(v1,v2,v3), names_to = "var") |>
  filter(value == "yes")

##>      ID var   value
##>   <int> <chr> <chr>
##> 1     1 v1    yes  
##> 2     2 v1    yes  
##> 3     3 v3    yes  
##> 4     4 v1    yes  
##> 5     5 v1    yes  
##> 6     6 v2    yes  
##> 7     7 v1    yes  
##> 8     8 v2    yes  
##> 9     9 v3    yes