Сравнение двух файлов в R и добавление совпавших строк из одного файла в другой, используя цикл for в R - PullRequest
0 голосов
/ 03 января 2019

У меня есть два файла. Я прочитал оба файла во фрейме данных в R. "ShortListedGenes" содержит 841 генов, а "EmpPval" содержит 6000 генов. Я хочу сопоставить каждый ген, присутствующий в "shortListedGenes", с генами, присутствующими в "EmpPval", и извлечь соответствующую информацию, присутствующую в 1-м, 2-м и 3-м столбце каждой строки (каждая строка представляет каждый ген) в файле "EmpPval", и добавьте его в "shortListedFile" в качестве новых столбцов. Поскольку я новичок в R, я использую простой подход и использую цикл, чтобы выполнить работу !!! но это дает ошибку. Файл "shortListedGenes" выглядит следующим образом

gene    hsq hsq.se  hsq.Pv  ZscoreHsq   PValueZ FDR
ENSG00000198502.5   0.909563    0.018102    0   50.24654734  
0   0
ENSG00000225138.3   0.876861    0.018487    0   47.43122194  
0   0

Второй файл "EmpPval" выглядит как

X   obsExp.perExp   obsExp.Pv   obsExp.perExp.1000  
ENSG00000000460.12  129 0.886162308 0.129   
ENSG00000000971.11  268 0.728160071 0.268   

Поэтому, когда ген (1-й столбец обоих файлов) совпадает, я хочу извлечь значения для соответствующего гена из файла «EmpPval» и добавить его в файл «shortListedGenes».

Код, который я пробовал до сих пор:

shortListedGenes <- read.csv("zs7-fdr0.05-Aorta.csv")
EmpPvAl <- read.csv("EmpiricalPvaluesAorta.csv") 

for(i in 1:nrow(shortListedGenes))
{
  for(j in 1:nrow(EmpPvAl))
  {
    if(shortListedGenes$gene[i] == EmpPvAl$X[j])
    {
      shortListedGenes$obsLessExp <- EmpPvAl$obsExp.perExp
      shortListedGenes$obsExp <- EmpPvAl$obsExp.Pv
      shortListedGenes$obsLessExpDiv <- EmpPvAl$obsExp.perExp.1000
    }
  }
}

и выдает ошибку Error in Ops.factor(EmpPvAl$X, shortListedGenes$gene[i]) : level sets of factors are different

Любое предложение / помощь будут оценены !!!. Спасибо

1 Ответ

0 голосов
/ 03 января 2019

Вы собираетесь выполнить слияние (all.x = TRUE, all.y = FALSE):

shortListedGenes <- merge(shortListedGenes, EmpPvAl[, c("X", "obsExp.perExp",
"obsExp.Pv", "obsExp.perExp.1000")], by.x = "gene", by.y = "X", all.x = TRUE, all.y = FALSE)

Проблема, связанная с вашим решением, заключается в том, что сначала необходимо создать переменные, и вам не хватало некоторой индексной нотации в присваивании каждой из трех новых переменных:

# Create variables
shortListedGenes$obsLessExp <- NA
shortListedGenes$obsExp <- NA
shortListedGenes$obsLessExpDiv <- NA

for(i in 1:nrow(shortListedGenes)){
    for(j in 1:nrow(EmpPvAl)){
        if(shortListedGenes$gene[i] == EmpPvAl$X[j]){
            # Index notation for i and j added:
            shortListedGenes$obsLessExp[i] <- EmpPvAl$obsExp.perExp[j]
            shortListedGenes$obsExp[i] <- EmpPvAl$obsExp.Pv[j]
            shortListedGenes$obsLessExpDiv[i] <- EmpPvAl$obsExp.perExp.1000[j]
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...