Есть ли способ написать цикл for, который выбирает наборы столбцов с разными строками, заканчивающимися на одно целое число?(данные протеомики) - PullRequest
1 голос
/ 28 апреля 2019

У меня большой массив данных с сотнями столбцов.Я хотел бы использовать dplyr для добавления нового столбца в этот набор данных с результатами математического преобразования.

Это набор данных протеомики, в котором я запустил несколько миксов TMT для массовой спецификации одновременно (эта деталь не имеет значения, но может быть полезна для людей, которые знакомы с данными LC-MS / MS).Из-за этого у меня есть несколько столбцов, помеченных как «интенсивность репортера [0-10] партия [1-7]», у меня также есть столбцы «партия iBAQ [1-7]».

Для каждого столбца интенсивности репортера [0-10] каждой партии, я хочу создать новый столбец с результатом этого преобразования:

(значение ячейки) x (iBAQ пакета) / (сумма каждой ячейки в строке изта же партия)

Исходные данные выглядят так:

dat <- structure(list(RIC.1.batch.1 = 1:2, RIC.2.batch.1 = c(3L, 5L), 
    RIC.1.batch.2 = 4:3, RIC.2.batch.2 = 5:4, iBAQ.batch.1 = c(12L, 
    15L), iBAQ.batch.2 = c(13L, 17L)), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"))

# A tibble: 2 x 6
  RIC.1.batch.1 RIC.2.batch.1 RIC.1.batch.2 RIC.2.batch.2 iBAQ.batch.1 iBAQ.batch.2
          <int>         <int>         <int>         <int>        <int>        <int>
1             1             3             4             5           12           13
2             2             5             3             4           15           17

И я хотел бы добавить столбцы, подобные этому, добавленные в таблицу с помощью mutate:

iBAQfrac1batch1|iBAQfrac2batch1|iBAQfrac1batch2|iBAQfrac2batch2
3.00            9.00            5.78            7.22
4.29            10.71           7.29            9.71

Я не могу придумать разумного способа написать функцию, которая сопоставляет каждую строку интенсивности репортера каждой партии со столбцом iBAQ той же самой партии, без простой группировки всех столбцов вручную.Я просто хочу сделать это более разумным способом, чтобы в дальнейшем, если бы у меня были данные с переменным числом каналов интенсивности репортера, я мог бы все же прогнать кадр данных через один и тот же код, не подвергая его воздействию.

Могу ли я написать цикл for, где я бы сказал, что для каждого столбца интенсивности репортера, заканчивающегося на n, выполняется ли преобразование с iBAQ, заканчивающимся тем же значением n?

1 Ответ

0 голосов
/ 29 апреля 2019

Как это работает для вас?

Это комбинация вложенных применений и регулярных выражений для извлечения всего, что вам нужно:

library(dplyr)
library(stringr)

# does the calculation, extracts appropriate columns with regular expressions
fun <- function(dat, frac, batch) {
  tibble(key = frac, value = dat[[frac]] * dat[grepl(paste0("^iBAQ.*", batch, "$"), names(dat))] / sum(dat[grepl(paste0("^RIC.*", batch, "$"), names(dat))]))
}

# loop through data rows
apply(dat, 1, function(x) {
  # apply calculation to all combos of frac/batch
  d <- apply(tibble(frac = names(dat)[grepl("^RIC.*", names(dat))], batch = str_extract(frac, "\\d$")),
        1,
        function(y) fun(x, y["frac"], y["batch"])) %>%
    bind_rows()

  output <- d$value
  names(output) <- d$key
  output
}) %>%
  t() %>% # transpose the output from apply
  as_tibble() %>% # make data frame object
  setNames(str_replace(names(.), "RIC", "iBAQfrac") %>% # rename columns to match question
             str_replace_all("\\.", ""))

# A tibble: 2 x 4
  iBAQfrac1batch1 iBAQfrac2batch1 iBAQfrac1batch2 iBAQfrac2batch2
            <dbl>           <dbl>           <dbl>           <dbl>
1            3                9              5.78            7.22
2            4.29            10.7            7.29            9.71
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...