Как поступить дальше, если таблица имеет нулевой аргумент для l oop в R? - PullRequest
0 голосов
/ 29 января 2020

Позвольте мне объяснить этот вопрос на примере. У меня есть три фрейма данных:

df1: это большая таблица гигантов c, которая содержит всю информацию.

  df1 <- data.frame(Gene=c(1,2,3,4,5,6,7,8),
              Description=c("ribonuclease HII", "glycerol-3-phosphate dehydrogenase", "Arginyl-tRNA synthetase (EC 6.1.1.19) 17855:19195", "Arginyl-tRNA synthetase (EC 6.1.1.19)", "PAS domain S-box protein", "ribonuclease HII", "Isoleucyl-tRNA synthetase", "Succinyl-CoA ligase"),
              Species=c("aa", "bb","aa","cc","ee","ff","aa","dd"),
              Number1= c(1,0,3,20,99,100,31,123),
              Number2 =c(1000, 12636,12,455,231,454,123,1), stringsAsFactors = FALSE)


        > df1
  Gene                                       Description Species Number1 Number2
1    1                                  ribonuclease HII      aa       1    1000
2    2                glycerol-3-phosphate dehydrogenase      bb       0   12636
3    3 Arginyl-tRNA synthetase (EC 6.1.1.19) 17855:19195      aa       3      12
4    4             Arginyl-tRNA synthetase (EC 6.1.1.19)      cc      20     455
5    5                          PAS domain S-box protein      ee      99     231
6    6                                  ribonuclease HII      ff     100     454
7    7                         Isoleucyl-tRNA synthetase      aa      31     123
8    8                               Succinyl-CoA ligase      dd     123       1

И df2 и df3, которые являются подмножествами df1 после некоторых функций grepl и regex:

 df2 <- data.frame(Gene=c(1,2,3,4,5,6),
              Description=c("ribonuclease HII", "glycerol-3-phosphate dehydrogenase", "glycerol-3-phosphate dehydrogenase", "Arginyl-tRNA synthetase (EC 6.1.1.19)", "PAS domain S-box protein", "glycerol-3-phosphate dehydrogenase"),
              Species=c("aa", "bb","aa","cc","ee","ff"),
              Number1= c(1,0,3,20,99,100),
              Number2 =c(1000, 12636,12,455,231,454), stringsAsFactors = FALSE)

df3 <- data.frame(Gene=c(1,2,3,4,5,6),
                  Description=c("ribonuclease HII", "nitrite reductase large subunit", "Arginyl-tRNA synthetase (EC 6.1.1.19) 17855:19195", "Cytochrome cd1 nitrite reductase (EC:1.7.2.1)", "PAS domain S-box protein", "nitrite reductase large subunit"),
                  Species=c("aa", "bb","aa","cc","dd", "ff"),
                  Number1= c(1,0,3,20,99,100),
                  Number2 =c(1000, 12636,12,455,231,454), stringsAsFactors = FALSE)



     > df2
  Gene                           Description Species Number1 Number2
1    1                      ribonuclease HII      aa       1    1000
2    2    glycerol-3-phosphate dehydrogenase      bb       0   12636
3    3    glycerol-3-phosphate dehydrogenase      aa       3      12
4    4 Arginyl-tRNA synthetase (EC 6.1.1.19)      cc      20     455
5    5              PAS domain S-box protein      ee      99     231
6    6    glycerol-3-phosphate dehydrogenase      ff     100     454
> df3
  Gene                                       Description Species Number1 Number2
1    1                                  ribonuclease HII      aa       1    1000
2    2                   nitrite reductase large subunit      bb       0   12636
3    3 Arginyl-tRNA synthetase (EC 6.1.1.19) 17855:19195      aa       3      12
4    4     Cytochrome cd1 nitrite reductase (EC:1.7.2.1)      cc      20     455
5    5                          PAS domain S-box protein      dd      99     231
6    6                   nitrite reductase large subunit      ff     100     454

Резюме моего вопроса:

Здесь я хотел бы получить все названия видов из df1 с определенным названием «Description» и найти его в df2 и df3. Если в обоих этих данных существует указанное имя c Description, я хочу вернуть таблицу, содержащую всю информацию об этом виде, с новым столбцом, в котором будет указан «полный путь» рядом с видами, проходящими этот критерий. Если он существует только в df2, он должен записать в новый столбец как неполный путь. Если этот вид не существует в обоих данных, он должен перейти к следующему виду и должен написать «Нет вхождений» в новый столбец. В конце я бы хотел таблицу с недавно произведенной информацией.

Вот что я попробовал (я выбрал определенное описание для df2 и df3, а именно «глицерол-3-фосфатдегидрогеназа» и «большая субъединица нитритредуктазы» соответственно):

 for(i in unique(df1$Species)) {
  x = subset(df2, Species == i & Description == "glycerol-3-phosphate dehydrogenase")
  y = subset(df3, Species == i & Description == "nitrite reductase large subunit")
  if (!is.na(x$Species) & !is.na(y$Species)){
  print(i, "complete pathway")
  }
  else if(!is.na(x$Species) & is.na(y$Species)){
  print(i, "incomplete pathway")
  }
  else if (is.na(x$Species) & is.na(y$Species)){next}

  }

Однако выдается ошибка: Ошибка в if (! Is.na (x $ Species) &! Is.na (y $ Species)) {: аргумент имеет нулевую длину

Ожидаемый результат должна быть новая таблица (скажем, df4):

df4 <- data.frame(Species=c("aa", "bb","cc","ee","ff", "dd"),
              New.Table=c("Incomplete p.", "Complete p.","No occurences","No occurences","Incomplete p.", "No occurences"), stringsAsFactors = FALSE)
Species     New.Table
1      aa Incomplete p.
2      bb   Complete p.
3      cc No occurences
4      ee No occurences
5      ff Incomplete p.
6      dd No occurences

Заранее спасибо. Я также открыт для ваших предложений относительно названия и правок в тексте!

1 Ответ

0 голосов
/ 29 января 2020

Поскольку у вас есть дубликаты, функция all() позволяет мне проверить, все ли описания в df1 представлены в df2 или df3. Это пример решения, с которым я пришел, и скажите мне, ожидаете ли вы этого

my_species <- unique(df1$Species)
my_data_species <- data.frame(Species = my_species, stringsAsFactors = FALSE)
my_function <- function(x) {
  if (all(df1[which(df1$Species == my_species[x]), "Description"] %in% df2$Description) == TRUE & all(df1[which(df1$Species == my_species[x]), "Description"] %in% df3$Description) == TRUE) {
    my_data_species[x, "New Table"] <<- "complete pathway"
  } else if (all(df1[which(df1$Species == my_species[x]), "Description"] %in% df2$Description) == TRUE | all(df1[which(df1$Species == my_species[x]), "Description"] %in% df3$Description) == TRUE) {
    my_data_species[x, "New Table"] <<- "incomplete pathway"
  } else {
    my_data_species[x, "New Table"] <<- "No occurences"
  }
}
lapply(1:length(my_species), my_function)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...