基于分号将多值列拆分为多行的R语言数据处理需求
R语言拆分多值关联列的解决方案
先构造示例数据框:
df <- data.frame( Cola = "Qxxxx7; Pxxxx8", Colb = "Qxxxx7 [1-24]; Pxxxx8 [1-24]", Colc = "Qxxxx7 1xAcetyl [N-Term]; 1xPhospho [S4(100)]; Pxxxx8 1xAcetyl [N-Term]; 1xPhospho [S10(100)]", stringsAsFactors = FALSE )
使用tidyverse工具包可以高效完成拆分,代码如下:
library(tidyverse) df_processed <- df %>% # 拆分Cola为单行ID separate_rows(Cola, sep = "; ") %>% # 同步拆分Colb为对应ID的完整条目 separate_rows(Colb, sep = "; ") %>% # 提取ID作为匹配关键字 mutate(id = str_trim(Cola)) %>% # 按ID提取Colc中对应的所有修饰信息并合并 rowwise() %>% mutate( Colc = str_c( str_extract_all(Colc, str_c(id, " .*?(?=; ([A-Za-z0-9]+xxxx)|$)")[[1]], simplify = TRUE), collapse = "; " ) ) %>% ungroup() %>% select(-id)
运行后输出结果:
print(df_processed) #> Cola Colb Colc #> 1 Qxxxx7 Qxxxx7 [1-24] Qxxxx7 1xAcetyl [N-Term]; 1xPhospho [S4(100)] #> 2 Pxxxx8 Pxxxx8 [1-24] Pxxxx8 1xAcetyl [N-Term]; 1xPhospho [S10(100)]
说明
separate_rows负责将Cola和Colb的多值条目拆分为单行,保证每个ID对应一行数据;- 正则表达式
str_c(id, " .*?(?=; ([A-Za-z0-9]+xxxx)|$)")用于精准匹配Colc中属于当前ID的所有修饰内容,直到遇到下一个ID开头或字符串结束; - 该方案支持任意数量的ID分组,无需修改代码即可适配多行多组的实际数据。
内容的提问来源于stack exchange,提问作者John H
相关产品推荐
相关产品推荐

