drm*_*iod 4 r ggplot2 dplyr tidyr
我很确定已经有人问过类似的问题,但我不知道如何搜索它。
我经常获取宽格式的数据,就像我的 3 个实验 (ac) 的小例子一样。我通常转换为长格式并通过某些函数转换值(此处log2作为示例)。
我经常想做的是将所有实验相互对比,在这里我正在寻找一个方便的解决方案。如何转换我的数据框以获取构面,例如使用a~b,a~c和b~c...
到目前为止,我tidy::spread再次输入数据并执行 3 次ggplot命令,其中各个列名称为x和y。后来我将各个图表合并在一起。
有没有更方便的方法呢?
library(dplyr)
library(tidyr)
library(ggplot2)
df <- data.frame(
names=letters,
a=1:26,
b=1:13,
c=11:36
)
df %>%
tidyr::gather(experiment, value, -names) %>%
mutate(log2.value=log2(value))
Run Code Online (Sandbox Code Playgroud)
编辑
因为我从@hdkrgr得到了一个非常有用的答案,所以我修改了一些我的代码。这inner_join是一个很棒的技巧,我可以实现它来自动化我的想法,我仍然怀念的是一个聪明的过滤器来摆脱冗余数据,因为我不想绘制c~c或者b~a如果我已经绘制了a~b。我现在通过提供我想做的配对解决了这个问题,但是有人能想到一个直接的解决方案吗?我想不出有什么东西可以给我带来独特的搭配。
my_pairs <- c('a vs. b', 'a vs. c', 'b vs. c')
df %>%
as_tibble() %>%
tidyr::gather(experiment, value, -names) %>%
mutate(log2.value=log2(value)) %>%
inner_join(., ., by=c("names")) %>%
mutate(pairing=sprintf('%s vs. %s', experiment.x, experiment.y)) %>%
filter(pairing %in% my_pairs) %>%
ggplot(aes(log2.value.x, log2.value.y)) +
geom_point() +
facet_wrap( ~ pairing, labeller=label_both)
Run Code Online (Sandbox Code Playgroud)
从长格式开始的一种方法是对长数据进行自连接,以获得每行中两个实验的所有组合:
df %>%
tidyr::gather(experiment, value, -names) %>%
mutate(log2.value=log2(value)) %>%
inner_join(., ., by=c("names")) %>%
ggplot(aes(log2.value.x, log2.value.y)) + geom_point() + facet_grid(experiment.y ~ experiment.x)
Run Code Online (Sandbox Code Playgroud)
编辑:为了避免绘制冗余的实验对,您可以执行以下操作:
df %>%
tidyr::gather(experiment, value, -names) %>%
mutate(log2.value=log2(value)) %>% inner_join(., ., by=c("names")) %>%
filter(experiment.x < experiment.y) %>%
ggplot(aes(log2.value.x, log2.value.y)) + geom_point() + facet_wrap(~experiment.y + experiment.x)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
496 次 |
| 最近记录: |