Вычисления dplyr с участием двух столбцов фрейма данных (R)
Я довольно новичок в 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 ответа
Я объясню, что происходит в ближайшее время, но один из способов найти средство строк для ваших предполагаемых переменных:
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)
Я не совсем уверен, правильно ли я понимаю, что вам нужно сделать, но всякий раз, когда использую 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)))