如何在R语言中将分隔符分隔的state列拆分为二进制1/0列
把分隔列转成0/1哑变量的R实现方案
嘿,我来帮你搞定这个需求!你现在需要把state列里用|分隔的州缩写,拆成每个州单独的列,存在就填1,不存在填0对吧?下面给你两种实用的方法,按需选择就行~
方法一:用tidyverse工具链(直观易读)
如果你平时习惯用dplyr和tidyr这类包,这个方法很适合你,步骤清晰,容易理解:
首先加载需要的包:
library(tidyverse)
然后用你的原始数据,再一步步处理:
# 你的原始数据 state <- c('ACT', 'ACT|NSW|NT|QLD|SA|VIC', 'ACT|NSW|NT|QLD|TAS|VIC|WA', 'ACT|NSW|NT|SA|TAS|VIC', 'ACT|NSW|QLD|VIC', 'ACT|NSW|SA', 'ACT|NSW|NT|QLD|TAS|VIC|WA|SA', 'NSW', 'NT', 'NT|SA', 'QLD', 'SA', 'TAS', 'VIC', 'WA') df <- data.frame(id = 1:length(state),state) # 核心处理代码 df_result <- df %>% # 把每个行里用|分隔的州拆成单独的行,每个id对应多个行(每个州一行) separate_rows(state, sep = "\\|") %>% # 给每个拆分出来的州添加一个标记值1 mutate(value = 1) %>% # 把行转成列:州名作为列名,value作为值,没有的州填0 pivot_wider(names_from = state, values_from = value, values_fill = 0) # 查看最终结果 print(df_result)
方法二:用qdapTools包(简洁高效)
如果想要更短的代码,可以用qdapTools里的mtabulate函数,一步到位生成0/1矩阵:
先安装并加载包(如果还没装的话):
# install.packages("qdapTools") library(qdapTools)
然后处理数据:
# 把每个state字符串拆成字符向量的列表 state_list <- strsplit(df$state, "\\|") # 把列表转成0/1矩阵:每个元素对应一列,出现过填1,没出现填0 state_matrix <- mtabulate(state_list) # 把矩阵和原数据合并 df_result2 <- cbind(df, state_matrix) # 查看结果 print(df_result2)
两种方法都能得到你想要的结果:每个州作为单独的列,对应行里包含该州就显示1,否则显示0。
内容的提问来源于stack exchange,提问作者Choc_waffles
相关产品推荐
相关产品推荐

