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

R语言sapply出现额外输出的原因及结果存入数据框的方法

问题解答

一、额外输出行的原因

你看到的abc: 715 def: 1167是sapply的默认输出行为导致的:

  • sapply会自动收集你传入的匿名函数的返回值,并整理成带名字的向量输出。
  • 你的匿名函数里虽然用了多次print,但函数的最终返回值是最后一行代码print(nrow(df_nonmut))的结果——也就是nrow(df_nonmut)的数值。
  • 因此sapply会把每个基因对应的nonmut行数收集起来,加上基因名作为向量名称,最后自动打印这个向量,就出现了你看到的额外行。

二、生成目标格式数据框的实现方法

方法1:基于sapply修改实现

调整匿名函数的返回值,让它返回包含mut和nonmut行数的向量,再将结果整理成数据框:

# 假设你的数据框名为data
vec <- c('abc', 'def')

# 用sapply获取每个基因的mut和nonmut行数
gene_stats <- sapply(vec, function(x) {
  mut <- nrow(data[data$Gen == x, ])
  nonmut <- nrow(data[data$Gen != x, ])
  c(mut = mut, nonmut = nonmut)
}, simplify = FALSE)

# 转换为目标数据框
result_df <- do.call(rbind, gene_stats)
result_df <- data.frame(gene = rownames(result_df), result_df, row.names = NULL)

方法2:更高效的统计方法(推荐)

先统计每个基因的出现次数,再通过总行数计算nonmut行数,避免循环遍历,性能更优:

# 统计vec中每个基因的mut行数
mut_counts <- table(data$Gen)[vec]
# 获取数据框总行数
total_rows <- nrow(data)
# 构建目标数据框
result_df <- data.frame(
  gene = names(mut_counts),
  mut = as.numeric(mut_counts),
  nonmut = total_rows - as.numeric(mut_counts)
)

运行后result_df就会是你需要的格式:

gene mut nonmut
1  abc   5      3
2  def   2      5

(注:以上示例数值基于你提供的样例数据,实际运行时会匹配你的真实数据)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:02:47