【问题标题】:Converting columns with multiple values into binary variables将具有多个值的列转换为二进制变量
【发布时间】:2017-11-17 17:30:19
【问题描述】:

目标:清理一个数据框,该数据框有一列(我们称之为 v1),每个单元格中包含一个或(通常)多个值。我想根据 v1 中单元格中包含的值生成多个二进制变量(例如:v1_1、v1_2、v1_3)。 (现实:我有一个来自其他地方的非常大、丑陋的 excel 数据集,其中有许多具有多个值的单元格,并且希望有效地将它们分类为二进制列,最好使用 tidyverse 工具,但 base 也可以)。

可重现的例子:

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

【问题讨论】:

  • 试试cbind(df[1], as.data.frame.matrix(table(stack(setNames(strsplit(as.character(df$v1), ",\\s*"), df$caseID))[2:1])))

标签: r dplyr tidyr


【解决方案1】:

使用dplyrtidyr 的解决方案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2015-07-28
    • 2023-04-07
    • 2022-01-11
    相关资源
    最近更新 更多