在R语言中获取dataframe的MODULE列各分组对应行号向量的方法
R 按分组自动生成对应行号向量的实现方法
示例数据
你给出的示例数据结构如下:
df <- structure(list(landmark = c("Akanthion", "Asterion R PARIETAL R", "Asterion R TEMPORAL R", "Asterion R OCCIPITAL", "Asterion L PARIETAL L", "Asterion L TEMPORAL L", "Asterion L OCCIPITAL", "Basioccipital anterior OCCIPITAL", "Basioccipital anterior SPHENOID", "Basion"), MODULE = c(1, 4, 6, 7, 3, 5, 7, 7, 8, 7)), row.names = c("Akanthion", "Asterion R PARIETAL R", "Asterion R TEMPORAL R", "Asterion R OCCIPITAL", "Asterion L PARIETAL L", "Asterion L TEMPORAL L", "Asterion L OCCIPITAL", "Basioccipital anterior OCCIPITAL", "Basioccipital anterior SPHENOID", "Basion"), class = "data.frame")
实现方法
1. 基础R方案(无需额外安装包)
第一步:分组提取所有行号
# 按MODULE列的值分组,存储每个组对应的行号 group_row_list <- split(seq(nrow(df)), df$MODULE)
运行后得到的group_row_list是一个列表,每个元素对应一个MODULE分组的行号向量,你可以直接用group_row_list[["7"]]获取MODULE=7的行号。
第二步:批量生成独立的Group_xxx向量
如果需要把每个分组的行号单独存成以Group_开头的独立向量,直接运行循环即可:
for (mod_val in names(group_row_list)) { assign(paste0("Group_", mod_val), group_row_list[[mod_val]]) }
运行完成后直接输入Group_7就能得到对应的行号向量c(4,7,8,10),和你预期的逻辑完全一致。
可选:输出为示例中的紧凑格式
如果你需要输出c(4,7:8,10)这种合并连续行号的字符串格式,可以使用下面的格式化函数:
format_compact_vec <- function(num_vec) { if (length(num_vec) == 0) return("c()") segments <- c() seg_start <- num_vec[1] seg_end <- num_vec[1] for (i in 2:length(num_vec)) { if (num_vec[i] == seg_end + 1) { seg_end <- num_vec[i] } else { segments <- c(segments, ifelse(seg_start == seg_end, as.character(seg_start), paste0(seg_start, ":", seg_end))) seg_start <- seg_end <- num_vec[i] } } segments <- c(segments, ifelse(seg_start == seg_end, as.character(seg_start), paste0(seg_start, ":", seg_end))) paste0("c(", paste(segments, collapse = ", "), ")") } # 批量打印所有分组的紧凑格式定义 for (mod_val in names(group_row_list)) { cat(paste0("Group_", mod_val, " <- ", format_compact_vec(group_row_list[[mod_val]]), "\n")) }
用你的示例数据运行后输出结果完全符合你的预期:
Group_1 <- c(1) Group_3 <- c(5) Group_4 <- c(2) Group_5 <- c(6) Group_6 <- c(3) Group_7 <- c(4, 7:8, 10) Group_8 <- c(9)
性能说明
该方案时间复杂度为O(n),针对你1487行的数据集可以瞬间完成,不需要任何手动调整。
内容的提问来源于stack exchange,提问作者antecessor
相关产品推荐
相关产品推荐

