将字符串变量分成几个变量
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
我有字符类型的数据(数据框中的一列)。我想将这些字符分开,并根据内容,用 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