如何在R中统计多CSV文件中体细胞变异行数并绘制柱状图?
统计体细胞变异数量并绘制柱状图方案
嗨,我来帮你调整代码,实现只统计每个CSV文件中somatic类型的变异数量~
你的原始代码是用count.fields统计了每个文件的总行数(总变异数),但要筛选somatic类型,我们需要读取每个CSV文件并根据Origin列的条件来计数,具体修改步骤如下:
修改后的完整代码
# 获取所有CSV文件列表 combined_data <- list.files(pattern = ".csv") # 遍历每个文件,统计Origin为"somatic"的行数 num_somatic <- lapply(combined_data, function(x) { # 读取当前CSV文件 df <- read.csv(x) # 统计符合条件的行数,na.rm=TRUE避免NA值干扰计数 sum(df$Origin == "somatic", na.rm = TRUE) }) # 将列表转换为数值向量 varn_somatic <- unlist(num_somatic) # 创建数据框,建议用文件名作为x轴标签(比1:41更直观) table_somatic <- data.frame(filename = combined_data, somatic_count = varn_somatic) # 绘制柱状图 ggplot(data = table_somatic, aes(x = filename, y = somatic_count)) + geom_bar(stat = "identity") + # 旋转x轴标签,避免文件名过长重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1))
关键修改说明
- 替换计数逻辑:不再用
count.fields统计总行数,而是读取完整数据框后,用sum(df$Origin == "somatic")筛选并计数符合条件的行 - 处理NA值:添加
na.rm = TRUE,如果Origin列存在缺失值(NA),会自动忽略这些行,避免计数结果出现NA - 优化x轴标签:用实际文件名代替
1:41,这样图表能直接对应到每个文件,可读性更强;同时添加旋转x轴标签的主题设置,防止文件名过长重叠
可选优化:同时展示总变异数和体细胞变异数
如果需要在同一张图里对比总变异数和体细胞变异数,可以参考以下代码:
# 同时统计总变异数和体细胞变异数 counts <- lapply(combined_data, function(x) { df <- read.csv(x) total <- nrow(df) somatic <- sum(df$Origin == "somatic", na.rm = TRUE) data.frame(total, somatic) }) # 合并数据并整理格式 counts_df <- do.call(rbind, counts) counts_df$filename <- combined_data counts_long <- tidyr::pivot_longer(counts_df, cols = c(total, somatic), names_to = "variant_type", values_to = "count") # 绘制分组柱状图 ggplot(counts_long, aes(x = filename, y = count, fill = variant_type)) + geom_bar(stat = "identity", position = "dodge") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
内容的提问来源于stack exchange,提问作者Nour Hassan
相关产品推荐
相关产品推荐

