R Объединение списков с функционалами - PullRequest
0 голосов
/ 09 июля 2020

Я новичок в функционалах в R, поэтому этот вопрос вызван нехваткой c базовых знаний.

У меня есть 2 списка. Оба списка содержат большое количество наборов данных, имеют одинаковую длину и заголовки. Я хочу добавить столбец ко всем фреймам данных в списке 1 на основе простого уравнения между двумя списками. Для каждого списка я хочу сделать следующее:

temp$zscore <- (temp$Rho - zscore$mean)/zscore$SD

Любая полезная документация / учебник по работе со списками также приветствуется.

Список 1:

> Output2
$E1
   chr start   end ID gene_id gene_name  Rho Pval
1 chr1 10046 10550 E1    9999      9999 9999 9999

$E2
     chr  start    end ID           gene_id      gene_name         Rho       Pval
2   chr1 712903 715448 E2 ENSG00000177757.1         FAM87B  0.05054603 0.84212228
21  chr1 712903 715448 E2 ENSG00000187583.6        PLEKHN1  0.41706072 0.08508920
22  chr1 712903 715448 E2 ENSG00000187608.5          ISG15  0.24045408 0.33504436
23  chr1 712903 715448 E2 ENSG00000187634.6         SAMD11  0.22807018 0.36116656
24  chr1 712903 715448 E2 ENSG00000187642.5       C1orf170 -0.02537278 0.92039607
25  chr1 712903 715448 E2 ENSG00000187961.9         KLHL17  0.48115649 0.04322426
26  chr1 712903 715448 E2 ENSG00000188157.9           AGRN  0.10010320 0.69253961
27  chr1 712903 715448 E2 ENSG00000188290.6           HES4  0.04024768 0.87580888
28  chr1 712903 715448 E2 ENSG00000188976.6          NOC2L  0.11053725 0.66236936
29  chr1 712903 715448 E2 ENSG00000223764.2    RP11-54O7.3  0.32693838 0.18542180
210 chr1 712903 715448 E2 ENSG00000225880.4      LINC00115  0.24677339 0.32355096
211 chr1 712903 715448 E2 ENSG00000228327.2  RP11-206L10.2  0.08363450 0.74144830
212 chr1 712903 715448 E2 ENSG00000228794.4 RP11-206L10.11 -0.05675955 0.82419663
213 chr1 712903 715448 E2 ENSG00000230092.3  RP11-206L10.8  0.18703827 0.45738249
214 chr1 712903 715448 E2 ENSG00000230368.2         FAM41C  0.09448420 0.70920788
215 chr1 712903 715448 E2 ENSG00000230699.2    RP11-54O7.1  0.30385847 0.22025296
216 chr1 712903 715448 E2 ENSG00000237491.4  RP11-206L10.9  0.40378010 0.09656416
217 chr1 712903 715448 E2 ENSG00000240453.1 RP11-206L10.10  0.21152401 0.39945835
218 chr1 712903 715448 E2 ENSG00000240618.1  RP11-206L10.5  0.56290835 0.01500755
219 chr1 712903 715448 E2 ENSG00000272512.1   RP11-54O7.17  0.15830049 0.53041538

Пример списка 2 фреймов данных:

> zscore
$E1
       mean        SD
1 -0.111857 0.2508317

$E2
        mean        SD
1 0.09520034 0.2050961

1 Ответ

1 голос
/ 09 июля 2020

Это можно сделать с помощью Map, который сопоставляет функцию со следующими аргументами, в данном случае двумя списками list1 и list2:

f <- function(x, y){
  x[['zscore']] <- (x[['Rho']] - y[['mean']])/y[['SD']]
  x
}

Map(f, list1, list2)
#[[1]]
#         Rho      Pval    zscore
#1 0.05054603 0.8421223 0.6055256
#2 0.41706072 0.0850892 2.0601302
#3 0.24045408 0.3350444 1.3592229
#
#[[2]]
#         Rho      Pval    zscore
#1 0.05054603 0.8421223 0.6055256
#2 0.41706072 0.0850892 2.0601302
#3 0.24045408 0.3350444 1.3592229

Data

temp <- read.table(text = "
         Rho      Pval
  0.05054603 0.8421223
  0.41706072 0.0850892
  0.24045408 0.3350444
", header = TRUE)

zscore <- read.table(text = "
      mean                SD
1     -0.1020274           0.2519686
", header = TRUE)

list1 <- list(temp, temp)
list2 <- list(zscore, zscore)

Edit

С новой структурой данных следующая обновленная функция кажется более подходящей для решения проблемы.

f <- function(x, y){
  x[['E1']][['zscore']] <- (x[['E1']][['Rho']] - y[['E1']][['mean']])/y[['E1']][['SD']]
  x
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...