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

4

我有一个数据(dataframe 中的一列)是字符类型。我想要将这些字符分开,并根据内容,将不同的变量用 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。感谢!

1
仅寻找单个值,不包括范围。 - Sara Altamirano
2个回答

2
也许,使用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

或者使用基本的 R 语言

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

0
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接