вычисления dplyr с использованием двух столбцов фрейма данных (R) - PullRequest
0 голосов
/ 27 апреля 2018

Я довольно новичок в R и не смог найти четкого ответа на мой вопрос после тщательного поиска в Интернете. Я пытаюсь заставить функции dplyr выполнять следующую задачу:

У меня есть следующий data.frame в виде tibble: столбцы, начинающиеся с X., указывают на разные образцы, а строки указывают, насколько выражен конкретный ген.

 head(immgen_dat)
# A tibble: 6 x 212
  ProbeSetID GeneName  Description         X.proB_CLP_BM. X.proB_CLP_FL. X.proB_FrA_BM. X.proB_FrA_FL. X.proB_FrBC_BM.
       <int> <fct>     <fct>                        <dbl>          <dbl>          <dbl>          <dbl>           <dbl>
1   10344620 " Gm1056~ " predicted gene 1~           15.6           15.3           17.2           16.1            18.1
2   10344622 " Gm1056~ " predicted gene 1~          240.           255.           224.           312.            272. 
3   10344624 " Lypla1" " lysophospholipas~          421.           474.           349.           478.            459. 
4   10344633 " Tcea1"  " transcription el~          802.           950.           864.           968.           1056. 
5   10344637 " Atp6v1~ " ATPase H+ transp~          199.           262.           167.           267.            255. 
6   10344653 " Oprk1"  " opioid receptor ~           14.8           12.8           18.0           13.2            15.3
# ... with 204 more variables: X.proB_FrBC_FL. <dbl>,

Я добавил переменную среднего выражения в конце для каждого гена, используя следующий код (диапазон переменных - первый и последний образец):

immgen_avg <- immgen_dat %>%
                 rowwise() %>% 
                   mutate(Average = mean(X.proB_CLP_BM.:X.MLP_FL.))

Здесь у меня есть быстрый вопрос: возвращенное значение mean, которое я получаю из этого кода, не соответствует среднему значению, которое я вычислил в другом месте (в Excel). Я не думаю, что есть какие-либо пропущенные значения.

Я хотел бы сделать следующее: для каждого гена я хотел бы сравнить значения выборки со средним значением и рассчитать log2-кратную разницу (log2-разность экспрессии гена в образце по сравнению с среднее значение выражения по всем образцам). Я хотел бы сохранить этот фрейм данных с именем immgen_log2 и выполнить некоторые последующие анализы. В этом новом фрейме данных я хотел бы сохранить имена генов, потому что я думаю объединить это с другой таблицей данных, чтобы сравнить изменения log2 между различными экспериментами.

Каков наилучший способ сделать это? Я ценю ваши ответы.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Я не совсем уверен, правильно ли я понимаю, что вам нужно делать, но всякий раз, когда используется dplyr или tidyverse в целом (также ggplot2), длинное представление ваших данных работает лучше всего. Я предполагаю, что вы хотите вычислить среднее значение всех переменных, начиная с X. для каждого ProbeSetID. Затем для каждой X. -колонки и ProbeSetID рассчитайте коэффициент и возьмите log2, т.е. log2(X.bla/mean):

df <- read.table(text = 'ProbeSetID  X.proB_CLP_BM. X.proB_CLP_FL. X.proB_FrA_BM. X.proB_FrA_FL. X.proB_FrBC_BM.
           10344620        15.6           15.3           17.2           16.1            18.1
           10344622        240.           255.           224.           312.            272. 
           10344624        421.           474.           349.           478.            459. 
           10344633      802.           950.           864.           968.           1056. 
           10344637      199.           262.           167.           267.            255. 
           10344653      14.8           12.8           18.0           13.2            15.3', header = T)

library(dplyr)
library(tidyr)

result <- 
  df %>% 
  # transform to long:
  gather(key = key, value = value, grep(x = names(.), pattern = "^X\\.")) %>% 
  # group by IDs, ie make rowwise calculations if it was still wide, but faster:
  group_by(ProbeSetID) %>% 
  # calculate group-mean on the fly and calculate log-ratio directly:
  mutate(log2_ratio = log2(value / mean(value)))

# transform back to wide, if needed:
result %>% 
  # remove initial values to have only 1 value variable:
  select(-value) %>% 
  # go back to wide:
  spread(key = key, value = log2_ratio)


# or, if you want to keep all values:
df %>% 
  # transform to long:
  gather(key = key, value = value, grep(x = names(.), pattern = "^X\\.")) %>% 
  # group by IDs, ie make rowwise calculations if it was still wide, but faster:
  group_by(ProbeSetID) %>% 
  # calculate the mean of each observation:
  mutate(mean_value = mean(value)) %>% 
  # go back to wide:
  spread(key, value) %>% 
  # now do the transformation to each variable that begins with X.:
  mutate_at(.vars = vars(matches("^X\\.")), 
            .funs = funs(log2_ratio = log2(./mean_value)))
0 голосов
/ 27 апреля 2018

Я объясню, что происходит в ближайшее время, но один из способов найти средние значения строк для ваших предполагаемых переменных:

immgen_dat %>%
  mutate(Average = apply(.[, 4:8], 1, mean)) %>%
  select(Average)

#   Average
# 1   16.46
# 2  260.60
# 3  436.20
# 4  928.00
# 5  230.00
# 6   14.82

Чтобы увидеть, что происходит с вашим кодом, мы можем использовать функцию do следующим образом:

df2 <- immgen_dat %>%
  rowwise() %>%
  do(Average = .$X.proB_CLP_BM.:.$X.proB_FrBC_BM.) 
df2$Average[1]

# [[1]]
# [1] 15.6 16.6 17.6

Вы увидите, что : генерирует последовательность из 15,6 с шагом 1. Вы можете увидеть это более подробно, набрав help(":"). Так что в

immgen_dat %>%
  rowwise() %>%
  mutate(Average = mean(X.proB_CLP_BM.:X.proB_FrBC_BM.))

Вы вычисляете средние значения этих последовательностей.


Редактировать

Логарифм отношений - это, конечно, различия логарифмов (при условии, что знаменатель не равен нулю). Таким образом, вы пытаетесь найти отличия между log2 каждого из других числовых переменных от log2 Average, вы можете сделать что-то вроде.

immgen_log2 <- immgen_dat
immgen_log2[,4:9] <- log(immgen_dat[,4:9])
immgen_log2[,4:8] <- sapply(immgen_log2[,4:8], func)
...