R语言列表在循环中如何迭代?

打算把实验室的数据进行分析。需要得到显著性的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 值结果。