基于字符结尾对R语言Data Frame进行子集划分
基于Barcode末尾数字分组的解决方案
嘿,作为R语言新手碰到这种分组问题太正常啦!我来给你捋个清晰的思路,比你之前尝试的which()+endsWith()组合要省心得多,毕竟要一个个写16个数字的判断真的太繁琐了😅
核心思路
先把barcode末尾的数字单独提取出来,再根据你想要的分组规则直接归类,这样操作起来既清晰又不容易出错。
步骤1:提取Barcode末尾的数字
首先得把barcode最后面的数字拎出来,这里分两种场景处理:
- 如果你的barcode末尾是1位数字(比如
BC001),可以用substr()提取最后一位:# 假设你的data.frame名叫df df$end_num <- as.integer(substr(df$barcode, nchar(df$barcode), nchar(df$barcode))) - 如果barcode末尾可能是2位数字(比如
BC010对应末尾10),用stringr包的str_extract()更稳妥,能自动匹配最后连续的数字:
这里的正则表达式# 先加载stringr(属于tidyverse套件,新手可以直接安装tidyverse包) library(stringr) df$end_num <- as.integer(str_extract(df$barcode, "\\d+$"))\\d+$意思是"匹配最后面所有连续的数字",完美覆盖1位或2位数字的情况。
步骤2:自定义规则分组
接下来用dplyr包的case_when()来定义分组规则,逻辑非常直观,你可以根据自己的实际需求调整区间:
library(dplyr) df <- df %>% mutate(group = case_when( end_num %in% 1:2 ~ "Group 1", # 结尾1、2归为第一组 end_num %in% 3:5 ~ "Group 2", # 结尾3、4、5归为第二组 end_num %in% 6:8 ~ "Group 3", # 结尾6、7、8归为第三组 end_num %in% 9:12 ~ "Group 4", # 结尾9-12归为第四组 end_num %in% 13:16 ~ "Group 5", # 结尾13-16归为第五组 TRUE ~ "Uncategorized" # 处理意外情况(比如末尾数字不在1-16范围内) ))
步骤3:拆分成独立子集
如果需要把每个组单独拆成一个独立的data.frame,用split()函数就能搞定:
# 得到一个列表,每个元素对应一个分组的data.frame grouped_dfs <- split(df, df$group) # 比如要调用第一组数据,直接用 grouped_dfs[["Group 1"]] 即可
为什么不推荐which()+endsWith()?
不是说这两个函数不能用,而是当数字数量多了之后,你要写一堆endsWith(df$barcode, "1") | endsWith(df$barcode, "2") | ...,不仅写着麻烦,后期修改分组规则也很费劲。而提取数字后用区间或%in%判断,逻辑清晰多了!
内容的提问来源于stack exchange,提问作者Alureon
相关产品推荐
相关产品推荐

