You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R分组数据框按组取Top N行:函数修改及异常原因排查

问题背景

我有一个结构如下的大型DataFrame:

Rows: 0
Columns: 7
$ transcript         <chr> 
$ group              <fct> 
$ sample_name        <fct> 
$ transcript_biotype <chr> 
$ description        <chr> 
$ counts_total       <int> 
$ counts_unmod       <int> 

我的需求是:按sample_name分组,提取每组中指定列(例如counts_total)数值最高的N条transcripts。我自己编写了get_top_genes函数,但它无法正确返回每组预期的行数。

具体问题

  1. 如何修改get_top_genes函数,让它能接受三个参数:DataFrame、目标列名、每组返回的行数?
  2. (附加问题)为什么top_n()、slice_head()和slice_max()没有返回预期输出(每组2行)?

原函数问题说明

原函数错误地按group分组,使用top_n()时每组返回的行数不一致;改用slice_head(n=2)能得到正确结果,但希望行数可以通过参数传入而非硬编码;使用slice_max()也存在每组行数不均的问题。

测试用模拟数据代码

set.seed(0)

num_transcripts_per_group <- 100
num_sample_names_per_group <- 3
transcript_shared_percentage <- 0.5

common_transcripts <- paste0("Transcript_", 1:num_transcripts_per_group)

unique_transcripts <- list(
  group1 = lapply(1:num_sample_names_per_group, function(i) {
    setdiff(common_transcripts, sample(common_transcripts, round(transcript_shared_percentage * num_transcripts_per_group)))
  }),
  group2 = lapply(1:num_sample_names_per_group, function(i) {
    setdiff(common_transcripts, sample(common_transcripts, round(transcript_shared_percentage * num_transcripts_per_group)))
  })
)

df <- expand.grid(
  transcript = c(unlist(unique_transcripts$group1), unlist(unique_transcripts$group2)),
  group = factor(rep(c("group1", "group2"), each = num_sample_names_per_group)),
  sample_name = factor(rep(paste0("Sample_", 1:num_sample_names_per_group), 2)),
  transcript_biotype = rep("biotype", 2 * num_sample_names_per_group),
  description = rep("Transcript description", 2 * num_sample_names_per_group)
)

unique_counts_total <- sample(1:1000, num_transcripts_per_group, replace = TRUE)
unique_counts_unmod <- sample(5:500, num_transcripts_per_group, replace = TRUE)

df$counts_total <- sample(unique_counts_total, nrow(df), replace = TRUE)
df$counts_unmod <- sample(unique_counts_unmod, nrow(df), replace = TRUE)

rownames(df) <- NULL

df <- df %>% mutate(sample_name = ifelse(group == "group2", paste0("sample", 4:6), as.character(sample_name)))

print(df)

内容的提问来源于stack exchange,提问作者ramen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 17:16:02