рассчитать все возможные линейные отношения в кадре данных - PullRequest
0 голосов
/ 05 июня 2019

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

        sample1 sample2 sample3
gene1   2       23      323
gene2   23      53      56
gene3   565     55      13

out:

             sample1 sample2 sample3
gene1_gene2  2/23    23/53   323/56
gene1_gene3  2/565   23/55   323/13
gene2_gene3  23/565  53/55   56/13

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Я думаю, вы вполне можете использовать функцию outer. Что-то вроде следующего, даже если не очень элегантно:

library(magrittr) # just for the %>% pipe...
df <- data.frame(gene=c("G1", "G2", "G3"), s1=runif(3), s2=runif(3), s3=runif(3))

dfnew <- data.frame(comb=outer(df$gene, df$gene, paste, sep="_") %>% as.vector, s1ratio=outer(df$s1,df$s1, "/") %>% as.vector)

dfnew

   comb        s1
1 G1_G1 1.0000000
2 G2_G1 2.7052199
3 G3_G1 1.3417876
4 G1_G2 0.3696557
5 G2_G2 1.0000000
6 G3_G2 0.4959995
7 G1_G3 0.7452744
8 G2_G3 2.0161312
9 G3_G3 1.0000000
0 голосов
/ 05 июня 2019

Можно использовать combn из base R

out <- do.call(rbind, combn(rownames(df1), 2, FUN = function(x) 
       apply(df1[x, ], 2, paste, collapse="/"), simplify = FALSE))
row.names(out) <- combn(rownames(df1), 2, FUN = paste, collapse="_")
out
#           sample1  sample2 sample3 
#gene1_gene2 "2/23"   "23/53" "323/56"
#gene1_gene3 "2/565"  "23/55" "323/13"
#gene2_gene3 "23/565" "53/55" "56/13" 

Если нам нужны фактические значения, просто замените paste на

out <- do.call(rbind, combn(rownames(df1), 2, FUN = function(x) 
   apply(df1[x, ], 2, FUN = function(x) x[1]/x[2]), simplify = FALSE))
row.names(out) <- combn(rownames(df1), 2, FUN = paste, collapse="_")
out
#                sample1   sample2   sample3
#gene1_gene2 0.086956522 0.4339623  5.767857
#gene1_gene3 0.003539823 0.4181818 24.846154
#gene2_gene3 0.040707965 0.9636364  4.307692

данные

df1 <- structure(list(sample1 = c(2L, 23L, 565L), sample2 = c(23L, 53L, 
55L), sample3 = c(323L, 56L, 13L)), class = "data.frame", 
row.names = c("gene1", 
"gene2", "gene3"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...