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
相关产品推荐
相关产品推荐

