Как ускорить этот код R с помощью функций apply (lapply, mapply ect.)? - PullRequest
0 голосов
/ 31 января 2020

Я не обладаю достаточными навыками для применения функций apply или R. Но я знаю, что чрезмерно использую циклы, что замедляет мой код. Как можно ускорить следующий код с помощью функций применения или каким-либо другим способом?

sum_store = NULL
for (col in 1:ncol(cazy_fams)){ # for each column in cazy_fams (so for each master family eg. GH, AA ect...)
  for (row in 1:nrow(cazy_fams)){ # for each row in cazy fams (so the specific family number e.g GH1 AA7 ect...)
    # Isolating the row that pertains to the current cazy family being looked at for every dataframe in the list
    filt_fam = lapply(family_summary, function(sample){
      sample[as.character(sample$Family) %in% paste(colnames(cazy_fams[col]),cazy_fams[row,col], sep = ""),]
    })
    row_cat = do.call(rbind, filt_fam) # concatinating the lapply list output int a dataframe
    if (nrow(row_cat) > 0){
      fam_sum = aggregate(proteins ~ Family, data=row_cat, FUN=sum) # collapsing the dataframe into one row and summing the proteins count
      sum_store = rbind(sum_store, fam_sum) # storing the results for that family
    } else if (grepl("NA", paste(colnames(cazy_fams[col]),cazy_fams[row,col], sep = "")) == FALSE) {
      Family = paste(colnames(cazy_fams[col]),cazy_fams[row,col], sep = "")
      proteins = 0
      sum_store = rbind(sum_store, data.frame(Family, proteins))
    } else {
      next
    }
  }
}

family_summary - это просто список из 18 двухкадровых данных, которые выглядят так:

Family proteins
CE0        2
CE1        9
CE4       15
CE7        1
CE9        1
CE14       10
GH0        5
GH1        1
GH3        4
GH4        1
GH8        1
GH9        2
GH13        2
GH15        5
GH17        1

с различными семействами кази.

cazy_fams - это просто кадр данных, каждый класс которого равен классу (например, GH , AA ect ...) и строка ech - это семейный номер, взятый со связанного веб-сайта:

GH GT PL CE AA CBM
1  1  1  1  1   1
2  2  2  2  2   2
3  3  3  3  3   3
4  4  4  4  4   4
5  5  5  5  5   5
6  6  6  6  6   6
7  7  7  7  7   7
8  8  8  8  8   8
9  9  9  9  9   9
10 10 10 10 10  10
11 11 11 11 11  11
12 12 12 12 12  12
13 13 13 13 13  13
14 14 14 14 14  14
15 15 15 15 15  15

Причина, по которой стоит отметка else if (grepl("NA", paste(colnames(cazy_fams[col]),cazy_fams[row,col], sep = "")) == FALSE), заключается в том, что не все классы имеют то же количество семейств, поэтому при циклическом перерыве в моем фрейме данных я получаю несколько GHNA и AANA с символом NA в конце.

Выходной файл sum_store такой:

Family proteins
GH1       54
GH2       51
GH3      125
GH4       29
GH5       40
GH6       25
GH7        0
GH8       16
GH9       25
GH10       19
GH11        5
GH12        5
GH13      164
GH14        3
GH15       61

Фрейм данных со всеми перечисленными Cazy семьи и общее количество появлений по списку family_summary. Пожалуйста, дайте мне знать, если вам нужно что-нибудь еще, чтобы помочь ответить на мой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...