Biggod586 2023-06-24 19:07 采纳率: 55.6%
浏览 13
已结题

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)

请问我的代码是哪里没有注意呢?感谢解惑!

  • 写回答

1条回答 默认 最新

  • David1055259499 2023-06-24 19:27
    关注

    来自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 值结果。
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月2日
  • 已采纳回答 6月24日
  • 创建了问题 6月24日

悬赏问题

  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响
  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)