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
我得到了一个可怕的数据集,我正在努力清理它: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