将字符串变量分成几个变量

Separate character string variable into several variables

我有字符类型的数据(数据框中的一列)。我想将这些字符分开,并根据内容,用 0 和 1 填充单独的变量。 可以使用以下方法重新创建该列:

df <- data.frame(var = c("1;2", NA, "1;2;3;4;5", "3;5", "1", "1;4", "3", NA, "4", "1;5"))

比如字符可以是1到5,我想创建六个变量: var_1、var_2、var_3、var_4、var_5 和 var_NA。如果该行在字符串中有 1,我希望 var_1 包含 1,如果没有,则包含 0。 谢谢!

也许,使用 cSplit_e 是一种选择

library(splitstackshape)  
library(dplyr)
cSplit_e(df, 'var', sep=";", type = 'character', fill = 0, drop = TRUE)%>%
     mutate(var_NA = +(is.na(df$var)))
#    var_1 var_2 var_3 var_4 var_5 var_NA
#1      1     1     0     0     0      0
#2      0     0     0     0     0      1
#3      1     1     1     1     1      0
#4      0     0     1     0     1      0
#5      1     0     0     0     0      0
#6      1     0     0     1     0      0
#7      0     0     1     0     0      0
#8      0     0     0     0     0      1
#9      0     0     0     1     0      0
#10     1     0     0     0     1      0

或使用base R

t(sapply(strsplit(df$var, "[:;]"), function(x) +(1:5 %in% x)))

tidyverse中,我们可以通过在";"上拆分得到长格式的数据,用"var"创建一个列,将所有值改为1并得到宽格式的数据格式。

library(dplyr)
library(tidyr)

df %>%
  mutate(row = row_number()) %>%
  separate_rows(var, sep = ";") %>%
  mutate(col = paste0('var_', var), 
         var = 1) %>%
  pivot_wider(names_from = col, values_from = var, values_fill = 0) %>%
  ungroup %>%
  select(-row)

# A tibble: 10 x 6
#   var_1 var_2 var_NA var_3 var_4 var_5
#   <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
# 1     1     1      0     0     0     0
# 2     0     0      1     0     0     0
# 3     1     1      0     1     1     1
# 4     0     0      0     1     0     1
# 5     1     0      0     0     0     0
# 6     1     0      0     0     1     0
# 7     0     0      0     1     0     0
# 8     0     0      1     0     0     0
# 9     0     0      0     0     1     0
#10     1     0      0     0     0     1