将具有多个值的列转换为二进制变量
Converting columns with multiple values into binary variables
目标:清理一个数据框,该数据框的一列(我们称之为 v1)在每个单元格中包含一个或(通常)多个值。我想根据 v1 中单元格中包含的值生成多个二进制变量(比如:v1_1、v1_2、v1_3)。 (现实:我有一个来自其他地方的非常大、丑陋的 excel 数据集,其中有许多具有多个值的单元格,并且想有效地将它们分类为二进制列,最好使用 tidyverse 工具,但基础也可以)。
可重现的例子:
df <- data.frame(caseID = c(1:5),
v1 = c(2, 1, "1,3", 1, "2, 3"))
df
desired_df <- data.frame(caseID = c(1:5),
v1_1 = c(0, 1, 1, 1, 0),
v1_2 = c(1, 0, 0, 0, 1),
v1_3 = c(0, 0, 1, 0, 1))
desired_df
使用 dplyr
和 tidyr
的解决方案。
library(dplyr)
library(tidyr)
df2 <- df %>%
separate_rows(v1) %>%
mutate(Value = 1) %>%
spread(v1, Value, fill = 0) %>%
rename_at(vars(-caseID), funs(paste0("v1_", .)))
df2
# caseID v1_1 v1_2 v1_3
# 1 1 0 1 0
# 2 2 1 0 0
# 3 3 1 0 1
# 4 4 1 0 0
# 5 5 0 1 1
目标:清理一个数据框,该数据框的一列(我们称之为 v1)在每个单元格中包含一个或(通常)多个值。我想根据 v1 中单元格中包含的值生成多个二进制变量(比如:v1_1、v1_2、v1_3)。 (现实:我有一个来自其他地方的非常大、丑陋的 excel 数据集,其中有许多具有多个值的单元格,并且想有效地将它们分类为二进制列,最好使用 tidyverse 工具,但基础也可以)。
可重现的例子:
df <- data.frame(caseID = c(1:5),
v1 = c(2, 1, "1,3", 1, "2, 3"))
df
desired_df <- data.frame(caseID = c(1:5),
v1_1 = c(0, 1, 1, 1, 0),
v1_2 = c(1, 0, 0, 0, 1),
v1_3 = c(0, 0, 1, 0, 1))
desired_df
使用 dplyr
和 tidyr
的解决方案。
library(dplyr)
library(tidyr)
df2 <- df %>%
separate_rows(v1) %>%
mutate(Value = 1) %>%
spread(v1, Value, fill = 0) %>%
rename_at(vars(-caseID), funs(paste0("v1_", .)))
df2
# caseID v1_1 v1_2 v1_3
# 1 1 0 1 0
# 2 2 1 0 0
# 3 3 1 0 1
# 4 4 1 0 0
# 5 5 0 1 1