首页 > 解决方案 > 将单列中的信息转换为多列

问题描述

我在 R 中有一个数据框,其中一列中有一个代码子集。例如,

 df <- data.frame(
  x = 1:3,
  y = c("a", "d,e,f", "g,h"),
  stringsAsFactors = FALSE
)

我想最终得到一个数据框,其中第一列是键(“x”),然后是“a”,“b”,“c”的列,......其中每一行都有一个 1 或 0如果给定键值存在该值。我不知道我手头有多少这些变量。我努力了

n_vars <- df$y %>% str_split(",") %>% lappy(function(z) length(z)) %>% unlist() %>% max()
df <- separate(df, y, sep = ",", into = as.character(1:n_vars))

我不确定接下来的步骤是什么。任何帮助表示赞赏!

标签: rtidyr

解决方案


看起来像是cSplit_efrom的完美案例splitstackshape

library(splitstackshape)
cSplit_e(df, "y", type = "character", fill = 0, drop = TRUE)

#  x y_a y_d y_e y_f y_g y_h
#1 1   1   0   0   0   0   0
#2 2   0   1   1   1   0   0
#3 3   0   0   0   0   1   1

使用dplyrand tidyr,我们可以使用separate_rowsandspread

library(dplyr)
library(tidyr)

df %>%
  separate_rows(y) %>%
  mutate(n = 1) %>%
  spread(y, n, fill = 0)

推荐阅读