基于gs_name列出现次数筛选hallmark数据框行的技术咨询
筛选数据框中分组行数符合条件的行
在hallmark数据框中,gs_name列存在重复值,每个gs_name对应多行或单行数据。需要保留那些gs_name对应行数小于25行或大于500行的所有数据行。
用户尝试的错误代码:
for (i in hallmark$gs_name) { if (25 <= nrow(hallmark) >= 500) { subset.df <- hallmark } }
注:这段代码逻辑错误,既没有统计每个gs_name的分组行数,条件判断的是整个数据框的行数,且循环赋值会不断覆盖结果。
输入数据示例:
> dput(hallmark[c(1:5,300:305),3:4]) structure(list(gs_name = c("adipogenesis", "adipogenesis", "adipogenesis", "adipogenesis", "adipogenesis", "bile_acid_metabolism", "bile_acid_metabolism", "bile_acid_metabolism", "bile_acid_metabolism", "bile_acid_metabolism", "bile_acid_metabolism"), gene_symbol = c("ABCA1", "ABCB8", "ACAA2", "ACADL", "ACADM", "HSD17B4", "HSD17B6", "HSD3B1", "HSD3B7", "IDH1", "IDH2")), row.names = c(NA, -11L), class = c("tbl_df", "tbl", "data.frame"))
方法一:Base R 实现
先统计每个分组的行数,再筛选符合条件的分组并提取对应行:
# 统计每个gs_name的行数 group_counts <- table(hallmark$gs_name) # 筛选出符合条件的gs_name valid_groups <- names(group_counts)[group_counts < 25 | group_counts > 500] # 提取对应的数据行 subset_df <- hallmark[hallmark$gs_name %in% valid_groups, ]
方法二:dplyr 实现(更简洁)
利用tidyverse的分组筛选逻辑,代码更直观:
library(dplyr) subset_df <- hallmark %>% group_by(gs_name) %>% filter(n() < 25 | n() > 500) %>% ungroup()
说明:group_by(gs_name)按gs_name分组,n()返回当前分组的行数,filter保留行数满足条件的分组所有行,最后ungroup()取消分组恢复数据框结构。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

