如何在separate_rows()中用正则保留右括号拆分多选项数据
解决Google Forms多选地区数据拆分并保留右括号的问题
从Google Forms导出的Q11列是巴西地区多选数据,使用"), "作为分隔符,需要将每行的多选值拆分为单独行,同时保留每个地区条目的右括号)。原代码使用separate_rows(value, sep = "\\),")无法实现需求,因为会丢失右括号。
解决方案
核心是使用正则正向后顾断言匹配分隔符,确保拆分时不消耗右括号。以下提供两种可行的tidyverse方案:
方案一:改进separate_rows的正则表达式
library(tidyverse) # 先将factor类型的Q11转为字符型(避免因子处理问题) df <- df %>% mutate(Q11 = as.character(Q11)) # 拆分并保留右括号 final_df <- df %>% select(Q1, Q11) %>% # 保留需要的列(原代码包含Q1,若无需可移除) separate_rows(Q11, sep = "(?<=\\)), ")
正则说明
(?<=\\)), 是正向后顾断言:
(?<=\\)):确保当前位置的前一个字符是右括号)(需转义为\\)),:匹配分隔符中的逗号和空格
拆分时仅移除逗号和空格,完整保留前面的右括号。
方案二:使用str_split结合unnest
如果更习惯手动拆分字符串,可先生成列表列再展开:
final_df <- df %>% mutate(Q11 = as.character(Q11)) %>% select(Q1, Q11) %>% mutate(Q11 = str_split(Q11, "(?<=\\)), ")) %>% unnest(Q11)
验证结果
拆分后的Q11列将呈现为每行一个完整的地区条目,例如:
Sul (Rio Grande do Sul, Santa Catarina, Paraná)
Nordeste (Alagoas, Bahia, Ceará, Maranhão, Piauí, Pernambuco, Paraíba, Rio Grande do Norte e Sergipe)
Sudeste (Espírito Santo, Minas Gerais, Rio de Janeiro e São Paulo)
内容的提问来源于stack exchange,提问作者Larissa Cury
相关产品推荐
相关产品推荐

