打算把实验室的数据进行分析。需要得到显著性的p value。使用Wilcox检验来检验对照组和试验组是否存在显著性差异。但是,Wilcox检验就的返回值result是个列表。其中result[3]是p value,但是进入循环后,p值都不变了,就算删除result后p值也是第一组数据的p值,不再更新。可是,可以进入判断语句,也可以得出判断结果。只不过满足条件后都是等于第一组数据的p值
data=read.csv("m6A.csv",header = T)
p <- 1:length(data$site)
for(i in 1:length(data$site)){
ref <- c(data$sample1_ref_m6a[i],data$sample2_ref_m6a[i],data$sample3_ref_m6a[i],data$sample4_ref_m6a[i],data$sample5_ref_m6a[i])
alt <- c(data$sample1_alt_m6a[i],data$sample2_alt_m6a[i],data$sample3_alt_m6a[i],data$sample4_alt_m6a[i],data$sample5_alt_m6a[i])
result <- wilcox.test(alt,ref,alternative = 'greater',paired = T)
if(result[3] < 0.05 ){
p[i] <- result[3]
rm(list = "result")
}
else{
p[i] <- NA
}
}
differntially <- unlist(p)
with_p <- data.frame(data$site,data$IP.1_ref,data$IP.1_alt,data$IP.2_ref,data$IP.2_alt,
data$IP.3_ref,data$IP.3_alt,data$IP.4_ref,data$IP.4_alt,
data$IP.5_ref,data$IP.5_alt,data$input.1_ref,data$input.1_alt,
data$input.2_ref,data$input.2_alt,data$input.34_ref,data$input.34_alt,
data$input.5_ref,data$input.5_alt,data$sample1_ref_m6a,data$sample2_ref_m6a,
data$sample3_ref_m6a,data$sample4_ref_m6a,data$sample5_ref_m6a,
data$sample1_alt_m6a,data$sample2_alt_m6a,data$sample3_alt_m6a,data$sample4_alt_m6a,data$sample5_alt_m6a,
differntially)
colnames(with_p) <- c('site','IP.1_ref','IP.1_alt','IP.2_ref','IP.2_alt','IP.3_ref','IP.3_alt','IP.4_ref','IP.4_alt',
'IP.5_ref','IP.5_alt','input.1_ref','input.1_alt',
'input.2_ref','input.2_alt','input.34_ref','input.34_alt',
'input.5_ref','input.5_alt','sample1_ref_m6a','sample2_ref_m6a',
'sample3_ref_m6a','sample4_ref_m6a','sample5_ref_m6a',
'sample1_alt_m6a','sample2_alt_m6a','sample3_alt_m6a','sample4_alt_m6a','sample5_alt_m6a',
'differntially')
write.csv(with_p,'m6a_with_p-value=0.05.csv',col.names = F)
请问我的代码是哪里没有注意呢?感谢解惑!
来自GPT的回答:
在 R 语言中,要在循环中迭代一个列表,可以使用列表的索引来访问和更新列表的元素。在您的代码中,为了更新 p 列表中的元素,您可以使用索引 i 来访问和更新 p[i] 的值。
以下是修改后的代码示例:
R
Copy code
data <- read.csv("m6A.csv", header = TRUE)
p <- vector("numeric", length(data$site))
for (i in 1:length(data$site)) {
ref <- c(data$sample1_ref_m6a[i], data$sample2_ref_m6a[i], data$sample3_ref_m6a[i], data$sample4_ref_m6a[i], data$sample5_ref_m6a[i])
alt <- c(data$sample1_alt_m6a[i], data$sample2_alt_m6a[i], data$sample3_alt_m6a[i], data$sample4_alt_m6a[i], data$sample5_alt_m6a[i])
result <- wilcox.test(alt, ref, alternative = 'greater', paired = TRUE)
if (result$p.value < 0.05) {
p[i] <- result$p.value
} else {
p[i] <- NA
}
}
differentially <- unlist(p)
with_p <- data.frame(data$site, data$IP.1_ref, data$IP.1_alt, data$IP.2_ref, data$IP.2_alt,
data$IP.3_ref, data$IP.3_alt, data$IP.4_ref, data$IP.4_alt,
data$IP.5_ref, data$IP.5_alt, data$input.1_ref, data$input.1_alt,
data$input.2_ref, data$input.2_alt, data$input.34_ref, data$input.34_alt,
data$input.5_ref, data$input.5_alt, data$sample1_ref_m6a, data$sample2_ref_m6a,
data$sample3_ref_m6a, data$sample4_ref_m6a, data$sample5_ref_m6a,
data$sample1_alt_m6a, data$sample2_alt_m6a, data$sample3_alt_m6a, data$sample4_alt_m6a, data$sample5_alt_m6a,
differentially)
colnames(with_p) <- c('site', 'IP.1_ref', 'IP.1_alt', 'IP.2_ref', 'IP.2_alt', 'IP.3_ref', 'IP.3_alt', 'IP.4_ref', 'IP.4_alt',
'IP.5_ref', 'IP.5_alt', 'input.1_ref', 'input.1_alt', 'input.2_ref', 'input.2_alt', 'input.34_ref', 'input.34_alt',
'input.5_ref', 'input.5_alt', 'sample1_ref_m6a', 'sample2_ref_m6a', 'sample3_ref_m6a', 'sample4_ref_m6a', 'sample5_ref_m6a',
'sample1_alt_m6a', 'sample2_alt_m6a', 'sample3_alt_m6a', 'sample4_alt_m6a', 'sample5_alt_m6a', 'differentially')
write.csv(with_p, 'm6a_with_p-value=0.05.csv', col.names = FALSE)
在上述代码中,我使用了 vector("numeric", length(data$site)) 来创建了一个长度为 data$site 的列表 p,并使用 p[i] 进行索引访问和更新。
请注意,代码中的 result$p.value 是用于获取 Wilcox 检验的 p 值。同时,我还进行了一些代码格式调整,以提高可读性。希望这可以帮助您正确迭代列表并获得正确的 p 值结果。