R-在由变量2分组的变量1的水平之间进行比较时变量的最大值

时间:2019-03-05 20:08:11

标签: r max tidyverse combn

请考虑以下数据

set.seed(123)

example.df <- data.frame( 
gene = sample(c("A", "B", "C", "D"), 100, replace = TRUE),
treated = sample(c("Yes", "No"), 100, replace = TRUE), 
resp=rnorm(100, 10,5), effect = rnorm (100, 25, 5))

我试图将所有变量与基因的水平进行比较,并按治疗分组,以获取最大值。我可以像这样创建 gene 组合

combn(sort(unique(example.df$gene)), 2, simplify = T)

#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] A    A    A    B    B    c   
#[2,] B    c    D    c    D    D   
#Levels: A B c D

编辑:我正在寻找的输出是这样的数据框

comparison   group    max.resp    max.effect
A-B          no       value1      value2
....
C-D          no       valueX      valueY
A-B          yes      value3      value4 
.... 
C-D          yes      valueXX     valueYY

虽然我能够获得按治疗 ...

分组的每个基因水平的最大值
max.df <- example.df %>% 
           group_by(treated, gene) %>% 
           nest() %>% 
           mutate(mod = map(data, ~summarise_if(.x, is.numeric, max, na.rm = TRUE))) %>% 
           select(treated, gene, mod) %>% 
           unnest(mod) %>% 
           arrange(treated, gene)

尽管试图解决这一问题超过一天,但我仍无法弄清楚如何获得每个2级 gene 比较中每个数字变量的最大值( A vs B,A与C,A与D,B与C,B与D以及C与D )进行了分组。

感谢您的帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

我找到了一个解决方案,它可能有点混乱,但是我将以更好的方式对其进行更新,这完全不需要时间

library(tidyverse)

首先,我生成一个具有两列的数据框,分别是Gen1和Gen2,以便进行可能的比较,这与您使用combn非常相似,但是创建了data.frame

GeneComp <- expand.grid(Gen1 = unique(example.df$gene), Gen2 = unique(example.df$gene)) %>% filter(Gen1 != Gen2) %>% arrange(Gen1)

然后我遍历分组

Comps <- list()
for(i in 1:nrow(GeneComp)){
  Comps[[i]] <- example.df %>% filter(gene == GeneComp[i,]$Gen1 | gene == GeneComp[i,]$Gen2) %>% # This line filters only the data with genes in the ith row
  group_by(treated) %>% # Then gorup by treated
  summarise_if(is.numeric, max) %>% # then summarise max if numeric
  mutate(Comparison = paste(GeneComp[i,]$Gen1, GeneComp[i,]$Gen2, sep = "-")) # and generate the comparisson variable
}

Comps <- bind_rows(Comps) # and finally join in a data frame

让我知道它是否可以满足您的所有需求

添加一次仅获取数据

在这里重要的是您的基因是字符串而不是因素,因此您可能必须这样做

options(stringsAsFactors = FALSE)

example.df <- data.frame( 
  gene = c(sample(c("A", "B", "C", "D"), 100, replace = TRUE)),
  treated = sample(c("Yes", "No"), 100, replace = TRUE), 
  resp=rnorm(100, 10,5), effect = rnorm (100, 25, 5))

然后在expand.grid中再次添加stringsAsFactors = F参数

GeneComp <- expand.grid(Gen1 = unique(example.df$gene), Gen2 = unique(example.df$gene), stringsAsFactors = F) %>% filter(Gen1 != Gen2) %>% arrange(Gen1)

现在,您可以在粘贴 Comparisson 变量对两个输入进行排序时进入循环,这样,行将重复,但是最后使用distinct函数时,它将按照您想要的方式生成数据

Comps <- list()
for(i in 1:nrow(GeneComp)){
    Comps[[i]] <- example.df %>% filter(gene == GeneComp[i,]$Gen1 | gene == GeneComp[i,]$Gen2) %>% # This line filters only the data with genes in the ith row
    group_by(treated) %>% # Then gorup by treated
    summarise_if(is.numeric, max) %>% # then summarise max if numeric
    mutate(Comparison = paste(sort(c(GeneComp[i,]$Gen1, GeneComp[i,]$Gen2))[1], sort(c(GeneComp[i,]$Gen1, GeneComp[i,]$Gen2))[2], sep = "-")) # and generate the comparisson variable
}

Comps <- bind_rows(Comps) %>% distinct() # and finally join in a data frame