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

箱线图莫名显示NA分组,但数据无NA的技术求助

NA分组的原因及解决办法

核心原因

你遇到的NA分组,本质是样本匹配失败导致的:

  • 创建Temp时,你直接把metadata$Response按顺序绑定给colnames(scores.batch),但如果metadata的样本顺序和scores.batch的列顺序不一致,或者两者样本数量不相等,会导致Temp里的样本名和分组标签对应错误。
  • 后续用right_join时,会保留scores.batch转置后的所有样本,那些在Temp里匹配不上的样本,其response字段会被填充为NA,最终ggplot把这些NA当成了一个分组。
  • droplevels无效是因为NA不是因子的闲置水平,它是缺失值,这个函数处理不了。

排查与解决步骤

1. 先验证样本匹配情况

运行以下代码,检查样本名是否一致、样本数量是否匹配:

# 检查scores.batch的样本数和metadata的行数
cat("scores.batch样本数:", length(colnames(scores.batch)), "\n")
cat("metadata行数:", nrow(metadata), "\n")

# 假设metadata的行名是样本名,对比样本名是否一致
# 如果metadata有单独的sample列,替换成metadata$sample
sample_scores <- colnames(scores.batch)
sample_meta <- rownames(metadata)

# 找出两边独有的样本
cat("scores.batch独有的样本:", setdiff(sample_scores, sample_meta), "\n")
cat("metadata独有的样本:", setdiff(sample_meta, sample_scores), "\n")

2. 修正代码:通过样本名正确关联分组

不要按顺序硬绑定分组,而是通过样本名进行关联,推荐用inner_join只保留两边都存在的样本,避免出现NA:

# 第一步:确保metadata有样本名列(如果行名是样本名,先转成列)
metadata <- metadata %>% rownames_to_column("sample")

# 第二步:转置scores.batch并整理成带样本名的数据框
scores_transposed <- scores.batch %>% 
  t() %>% 
  as.data.frame() %>% 
  rownames_to_column("sample")

# 第三步:通过样本名关联分组,只保留匹配成功的样本
plot_data <- scores_transposed %>% 
  inner_join(metadata %>% select(sample, Response), by = "sample")

# 第四步:绘图
ggplot(plot_data, aes(x = Response, y = `CD4+ memory T-cells`)) +
  geom_boxplot(aes(fill = Response)) +
  scale_fill_manual(values = c('red','lightblue')) +
  geom_jitter(color="black", size=0.8, alpha=0.9) +
  ylim(0, 0.35)

3. (可选)定位具体的NA样本

如果想知道哪些样本导致了NA,可以在原代码后加这行,查看匹配失败的样本:

temp_data <- scores.batch %>% 
  t() %>% 
  as.data.frame() %>% 
  rownames_to_column("sample") %>% 
  right_join(Temp, .)

# 查看response为NA的样本
filter(temp_data, is.na(response))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 06:36:28