在R中移除单突变簇后调整并重命名cluster_id列数值的方法
解决方法
可以用dplyr或者data.table包来实现需求,以下是两种常用方案:
方案一:使用dplyr包
# 先加载dplyr包(未安装请先运行 install.packages("dplyr")) library(dplyr) # 第一步:过滤掉每个样本下仅含1个突变的簇 filtered_data <- my_data %>% # 按样本ID和簇ID分组 group_by(sample_id, cluster_id) %>% # 只保留组内突变数大于1的行 filter(n() > 1) %>% # 取消分组 ungroup() # 第二步:对每个样本内的剩余簇重新编号 final_data <- filtered_data %>% # 按样本ID分组 group_by(sample_id) %>% # 基于原簇ID的出现顺序生成连续编号(从0开始) mutate(cluster_id = match(cluster_id, unique(cluster_id)) - 1) %>% ungroup()
代码说明:
group_by(sample_id, cluster_id):将数据按样本和对应的簇分组,方便统计每个簇的突变数量filter(n() > 1):n()返回当前组的行数(即突变数),只保留突变数大于1的簇match(cluster_id, unique(cluster_id)):获取原簇ID在当前样本内的唯一出现顺序,减1是为了让编号从0开始,实现原簇3→2、原簇4→3这类递补效果
方案二:使用data.table包
如果处理的是大数据集,data.table的运行效率更高:
# 加载data.table包(未安装请先运行 install.packages("data.table")) library(data.table) # 将数据框转换为data.table格式 setDT(my_data) # 第一步:过滤掉单突变簇 filtered_data <- my_data[, if (.N > 1) .SD, by = .(sample_id, cluster_id)] # 第二步:重新编号簇ID filtered_data[, cluster_id := match(cluster_id, unique(cluster_id)) - 1, by = sample_id]
代码说明:
.N是data.table内置变量,代表当前分组的行数.SD表示当前分组的所有列数据,if (.N >1) .SD即保留突变数大于1的分组数据- 后续编号逻辑和dplyr方案一致,通过
match和unique生成连续的簇ID
内容的提问来源于stack exchange,提问作者anna1335
相关产品推荐
相关产品推荐

