如何为cd4与cd8数据框逐行计算t检验p值?代码报错求助
问题分析与代码修正
报错原因
你写的map2(cd4, cd8, pcal)是按列遍历两个数据框,会把cd4的每一列和cd8的对应列作为参数传入pcal函数,而非按行处理。此时函数里的x是单个列(向量),用x[,1:3]调用会触发“维度错误”——向量没有二维索引结构。
修正方案
以下提供两种常用的修正方式,核心是实现按行提取cd4和cd8的3个重复样本值,再执行t检验:
方法1:基础R实现
假设你的数据框结构是:第一列为Ident,后3列为重复样本数据。
# 按行拆分两个数据框的样本列(排除Ident列) cd4_sample_rows <- split(cd4[, -1], seq(nrow(cd4))) cd8_sample_rows <- split(cd8[, -1], seq(nrow(cd8))) # 逐行计算t检验p值 p_values <- mapply(function(x, y) t.test(x, y)$p.value, cd4_sample_rows, cd8_sample_rows) # 合并Ident与p值得到结果 result_df <- data.frame(Ident = cd4$Ident, p_value = p_values)
方法2:tidyverse风格实现
如果习惯用dplyr+purrr的语法:
library(dplyr) library(purrr) # 逐行提取cd4和cd8的样本值为列表 cd4_row_data <- cd4 %>% select(-Ident) %>% rowwise() %>% mutate(data = list(c(cur_data()))) %>% pull(data) cd8_row_data <- cd8 %>% select(-Ident) %>% rowwise() %>% mutate(data = list(c(cur_data()))) %>% pull(data) # 计算每行p值并合并结果 result_df <- cd4 %>% select(Ident) %>% mutate(p_value = map2_dbl(cd4_row_data, cd8_row_data, ~t.test(.x, .y)$p.value))
更简洁的rowwise写法
如果明确知道3个样本列的名称(比如s1, s2, s3):
library(dplyr) result_df <- cd4 %>% # 合并cd8的样本列,添加后缀区分 bind_cols(cd8 %>% select(s1, s2, s3) %>% rename_with(~paste0(.x, "_cd8"))) %>% rowwise() %>% # 对当前行的两组样本执行t检验 mutate(p_value = t.test(c(s1, s2, s3), c(s1_cd8, s2_cd8, s3_cd8))$p.value) %>% # 保留需要的列 select(Ident, p_value)
内容的提问来源于stack exchange,提问作者sunny
相关产品推荐
相关产品推荐

