在R中基于字符串模式重塑列:用dplyr::mutate创建新列
R语言:基于字符串模式创建新列的解决方案
可复现数据
先定义原始数据框dat和目标数据框示例tidy_dat:
library(dplyr) library(stringr) # 原始数据 dat <- tibble( questionType = c( "prop1_condA_rank1_prob0.8", "prop2_condB_rank2_prob0.5", "prop1_condA_rank3_prob0.2", "prop3_condC_rank1_prob0.9" ), values = c("1,0.8", "2,0.5", "3,0.2", "1,0.9") ) # 目标数据框示例 tidy_dat <- tibble( questionType = c( "prop1_condA_rank1_prob0.8", "prop2_condB_rank2_prob0.5", "prop1_condA_rank3_prob0.2", "prop3_condC_rank1_prob0.9" ), values = c("1,0.8", "2,0.5", "3,0.2", "1,0.9"), propositions = c("prop1", "prop2", "prop1", "prop3"), condition = c("condA", "condB", "condA", "condC"), rank = c(1, 2, 3, 1), prob = c(0.8, 0.5, 0.2, 0.9) )
解决方案代码
使用dplyr::mutate()结合stringr工具提取字符串模式,同时拆分values列生成目标列:
tidy_result <- dat %>% mutate( # 从questionType提取命题标识 propositions = str_extract(questionType, "prop\\d+"), # 从questionType提取条件标识 condition = str_extract(questionType, "cond[A-Z]"), # 拆分values列获取rank并转为整数 rank = as.integer(str_split(values, ",", simplify = TRUE)[,1]), # 拆分values列获取prob并转为数值 prob = as.numeric(str_split(values, ",", simplify = TRUE)[,2]) ) # 查看结果 tidy_result
代码说明
- propositions列:通过正则
prop\\d+匹配questionType中以prop开头的命题部分。 - condition列:通过正则
cond[A-Z]匹配questionType中以cond开头的条件部分,若条件格式有变化(如cond_xxx),可调整正则为cond_.+?(?=_rank)精准匹配到rank前的内容。 - rank/prob列:用
str_split()按逗号拆分values列,分别提取对应部分并转换为对应数据类型。
内容的提问来源于stack exchange,提问作者Hanbin Go
相关产品推荐
相关产品推荐

