R语言data.frame行处理:移除指定区间行并匹配追加内容
R语言数据框处理解决方案
原始数据与需求
原始数据框:
df <- data.frame(V1 = c(">NP_abc d", "1", "Efg", "hij", "2", "3KL", "VGSFNGWDGRRHPMRLRHPTGVWEIFVPRLQPGEVYKYEILGAHGILPLKSDPMALATTLPPDTASKISAPLKFEWHDQD", ">WP_mno p", "Rst", "uw", "adb", "cgi", "PGLGIRLDKLASFVVTLSLYAGAYLTEVFRAGLLSIHKGQREAGLAIGLGEWQVRAYIIVPVMLRNVLPALSNNFISLFK", ">GP_hgs i Hhh yuy", "WEGLETPVQVVWRHALLPVIELPLAALHDPEPLNLLDAPLLRLVHAEDPDNQRIVAVLLFHHLIMDHVALDLLSHELQAV"))
匹配目标向量:
some_vector <- c("Efg", "hij", "Rst", "adb")
核心需求:
- 移除位于
>开头行和长度为80的行之间的所有中间行 - 若中间行字符串在
some_vector中,按出现顺序追加到对应>开头行末尾(以空格分隔)
解决方案代码
library(dplyr) library(tidyr) # 标记每行类型:header(>开头)、target(长度80)、other(中间行) df <- df %>% mutate( type = case_when( startsWith(V1, ">") ~ "header", nchar(V1) == 80 ~ "target", TRUE ~ "other" ) ) # 为每个header-target区间创建分组 df <- df %>% mutate(group = cumsum(type == "header")) # 分组处理:合并匹配内容、提取目标行 processed <- df %>% group_by(group) %>% summarise( header = paste( V1[type == "header"], paste(V1[type == "other" & V1 %in% some_vector], collapse = " "), sep = " " ), target = V1[type == "target"] ) %>% # 将分组结果展开为单列 pivot_longer(cols = c(header, target), values_to = "V1") %>% select(V1) %>% # 去除多余空格(无匹配内容时的冗余空格) mutate(V1 = trimws(V1)) # 转换为最终数据框 df1 <- as.data.frame(processed)
代码逻辑说明
- 行类型标记:通过
startsWith识别>开头的标题行,nchar识别长度为80的目标行,剩余归为中间行。 - 区间分组:用
cumsum累加标题行的出现次数,实现每个标题行到下一个标题行前的区间单独分组。 - 内容合并与提取:
- 每组内将标题行与匹配
some_vector的中间行用空格拼接 - 提取每组的目标行
- 每组内将标题行与匹配
- 格式整理:将分组后的标题和目标行转为单列,用
trimws清理多余空格,得到符合要求的数据框。
验证结果
运行代码后,df1的输出与预期完全一致:
print(df1) # V1 # 1 >NP_abc d Efg hij # 2 VGSFNGWDGRRHPMRLRHPTGVWEIFVPRLQPGEVYKYEILGAHGILPLKSDPMALATTLPPDTASKISAPLKFEWHDQD # 3 >WP_mno p Rst adb # 4 PGLGIRLDKLASFVVTLSLYAGAYLTEVFRAGLLSIHKGQREAGLAIGLGEWQVRAYIIVPVMLRNVLPALSNNFISLFK # 5 >GP_hgs i Hhh yuy # 6 WEGLETPVQVVWRHALLPVIELPLAALHDPEPLNLLDAPLLRLVHAEDPDNQRIVAVLLFHHLIMDHVALDLLSHELQAV
内容的提问来源于stack exchange,提问作者Traitor Legions
相关产品推荐
相关产品推荐

