Есть ли аккуратный код R для сопоставления функции изменения с вложенными таблицами? - PullRequest
0 голосов
/ 13 июля 2020

Я учусь как I go, и я создал вложенный фрейм данных ниже для некоторых протеомических данных.

dat_calc <- structure(list(Replicate = 1:5, data = list(structure(list(`Peptide Modified Sequence` = c("ABC", 
"DEF", "GHI", 
"JKL", "MNO"), peptide_sum_t0 = c(12798511, 
24445998, 430914, 4169733152, 1040954968), peptide_sum_t1 = c(71875113, 
90456209, 1425107, 3864848640, 908559156), peptide_sum_t2 = c(80887897, 
94159050, 1567133, 3063087696, 654452648), peptide_sum_t4 = c(134109987, 
135974685, 2576246, 2991914240, 694374412), peptide_sum_t6 = c(138155397, 
143414778, 2586848, 2196034192, 508895062)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L)), structure(list(
    `Peptide Modified Sequence` = c("ABC", "DEF", "GHI", "JKL", "MNO"), peptide_sum_t0 = c(11405482, 
    21481235, 376354, 3738850032, 923938424), peptide_sum_t1 = c(66144582, 
    88866961, 1430590, 3592766336, 807249328), peptide_sum_t2 = c(69746566, 
    77691183, 1300239, 2771424752, 608173524), peptide_sum_t4 = c(127165597, 
    132770276, 2615954, 2959854784, 689271096), peptide_sum_t6 = c(138884615, 
    156055042, 2950787, 2219060208, 501535220)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L)), structure(list(
    `Peptide Modified Sequence` = c("ABC", "DEF", "GHI", "JKL", "MNO"), peptide_sum_t0 = c(9940092, 
    19013854, 334340, 3856996752, 868267100), peptide_sum_t1 = c(64178814, 
    86212062, 1386698, 3411110848, 805829180), peptide_sum_t2 = c(67558997, 
    75232819, 1232377, 2768347280, 606519264), peptide_sum_t4 = c(114366051, 
    115555603, 2182557, 2922670992, 647771528), peptide_sum_t6 = c(156789588, 
    158925759, 2856535, 2321414288, 522189252)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L)), structure(list(
    `Peptide Modified Sequence` = c("ABC", "DEF", "GHI", "JKL", "MNO"), peptide_sum_t0 = c(9567490, 
    17515164, 320470, 3732104688, 840050720), peptide_sum_t1 = c(59593231, 
    80608967, 1214322, 3261328064, 714164192), peptide_sum_t2 = c(67902028, 
    78524336, 1178027, 2635069312, 637725132), peptide_sum_t4 = c(113122689, 
    112846563, 2291548, 2879263456, 647756704), peptide_sum_t6 = c(148436288, 
    152687330, 2912218, 2370981648, 539368072)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L)), structure(list(
    `Peptide Modified Sequence` = c("ABC", "DEF", "GHI", "JKL", "MNO"), peptide_sum_t0 = c(9080372, 
    16406681, 276146, 3520329840, 758908128), peptide_sum_t1 = c(56032381, 
    81149457, 1220275, 3300964608, 717219612), peptide_sum_t2 = c(69496622, 
    83156379, 1340797, 2722983344, 600339772), peptide_sum_t4 = c(116170303, 
    121481896, 2441887, 2647622272, 631005176), peptide_sum_t6 = c(144268687, 
    147230236, 2742541, 2051729408, 498884202)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L)))), class = "data.frame", row.names = c(NA, 
-5L))

В результате должен получиться фрейм данных, структурированный, как показано ниже:

# A tibble: 5 x 2
# Groups:   Replicate [5]
  Replicate data            
      <int> <list>          
1         1 <tibble [5 x 6]>
2         2 <tibble [5 x 6]>
3         3 <tibble [5 x 6]>
4         4 <tibble [5 x 6]>
5         5 <tibble [5 x 6]>

На данный момент я запускаю следующий код, чтобы разделить каждую строку в каждом вложенном тиббле данных на ссылочную строку [5], игнорируя столбец Peptide Modified Sequence.

dat_calc[[2]][[1]] <- dat_calc[[2]][[1]] %>% mutate_each(funs(./.[5]), setdiff(names(.), `Peptide Modified Sequence`))
dat_calc[[2]][[2]] <- dat_calc[[2]][[2]] %>% mutate_each(funs(./.[5]), setdiff(names(.), `Peptide Modified Sequence`))
dat_calc[[2]][[3]] <- dat_calc[[2]][[3]] %>% mutate_each(funs(./.[5]), setdiff(names(.), `Peptide Modified Sequence`))
dat_calc[[2]][[4]] <- dat_calc[[2]][[4]] %>% mutate_each(funs(./.[5]), setdiff(names(.), `Peptide Modified Sequence`))
dat_calc[[2]][[5]] <- dat_calc[[2]][[5]] %>% mutate_each(funs(./.[5]), setdiff(names(.), `Peptide Modified Sequence`))

Этот код отлично работает и возвращает вложенные таблицы, в которых каждая строка в таблице AB C, DEF, GHI и JKL делится на «MNO». 'AB C', 'DEF', 'GHI' и 'JKL' все дают соответствующее соотношение, и строка 'MNO' в каждом тиббле должна быть 1. Должен быть более элегантный способ справиться с этим. У кого-нибудь есть предложения?

Спасибо!

1 Ответ

0 голосов
/ 17 июля 2020

Как упоминалось в комментариях выше, purrr::map может помочь вам в этой задаче:)

В вашем примере это будет выглядеть примерно так:

library(dplyr)
library(purrr)

dat_calc.normalized <- dat_calc %>%
  mutate(
    data = map(.x = data, .f = function(df){
      df %>%
        mutate(
          across(.cols = -`Peptide Modified Sequence`, .fns = ~./.[5])
        )
    })
  )

(Более того , попробуйте перейти на mutate(across(...)) вместо mutate_each, который сейчас устарел)

...