Создавайте переменные с увеличенными именами и сохраняйте в них значения, все с циклом - PullRequest
0 голосов
/ 08 октября 2019

Чтобы упростить мою работу под RI, я бы хотел заменить следующий код:

testQ1 <- results(dds, name="XXXX", alpha=0.05, 
                 filterFun=ihw, 
                 lfcThreshold=1)

testQ2 <- results(dds, name="YYYY", alpha=0.05, 
                 filterFun=ihw, 
                 lfcThreshold=1)

testQ3 <- results(dds, name="ZZZZ",
                 alpha=0.05,
                 filterFun=ihw,
                 lfcThreshold=1)

на цикл:

treeQ <- c('XXXX', 'YYYY', 'ZZZZ')

outQ<-0

for( i in 1:length(treeQ)){  
  outQ[i]<-results(dds, name=treeQ[i], alpha=0.05, filterFun=ihw, lfcThreshold=1)
  }

Но я получаю:

Error in outQ[i] <- results(dds, name = treeQ[i], alpha = 0.05, filterFun = ihw,  : 
      incompatible types (from S4 to double) in subassignment type fix

Я не могу решить эту проблему. Я также слышал, что «применить» было бы лучшим решением, чем цикл «для», но в этом случае я застрял с увеличенными именами переменных ...

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Согласно комментариям и ответам, объявление пустого списка outQ <- list() и использование двойного скобка [[ ]] index решило мою проблему.

(Пока мне не нравятся списки и функция R lapply, потому что я много занимался кодированием php, так что цикл for говорит мне больше, но я попробую немного.)

Ниже приведен полный рабочий код, который создает переменные с инкрементными именами, производит вычисления, фильтрует и упорядочивает данные, сохраняет результаты в переменных и экспортирует данные в файлы CSV, все в том же виде. петля. Использование такого цикла очень полезно.

Если бы это могло кому-то помочь. Большое спасибо за вашу помощь.

  treeQ <- c('XXXX', 'YYYY', 'ZZZZ')

    outQ <- list()
    res05 <- list()
    resOrdered <- list()

    for( i in 1:length(treeQ)){  
      outQ[[i]]<-results(dds, name=treeQ[i], alpha=0.05, filterFun=ihw, lfcThreshold=1)
      res05[[i]] <- subset(outQ[[i]], padj < 0.05)
      print(nrow(res05[[i]]))
      resOrdered[[i]] <- res05[[i]][order(res05[[i]]$log2FoldChange),]
      resOrdered[[i]] <- as.data.frame(resOrdered[[i]])
      write.csv(resOrdered[[i]], file = paste("20191009_out_", treeQ[i], ".csv", sep=""))
      print(paste(i," : ok !",sep=" "))
      }
0 голосов
/ 08 октября 2019

Использование списков должно решить эту проблему.

outQ<- {}
    for( i in 1:length(treeQ)){  
      outQ[[i]]<-results(dds, name=treeQ[i], alpha=0.05, filterFun=ihw, lfcThreshold=1)
      }
...