【发布时间】:2020-08-18 21:37:57
【问题描述】:
我正在尝试做一个之前看起来很简单的操作,但我没有在网络上找到明确的解决方案。
我得到了这种表:
tibble(
block = c(1,1,1,2,2,2),
tag = letters[1:6],
start = c(15,54,78,27,45,80),
end = c(50,80,90,40,76,100),
direction = c(-1,-1,1,1,1,1),
anchor = c(FALSE,TRUE,FALSE,FALSE,TRUE,FALSE)
) -> df1
# A tibble: 6 x 6
block tag start end direction anchor
<dbl> <chr> <dbl> <dbl> <dbl> <lgl>
1 1 a 15 50 -1 FALSE
2 1 b 54 80 -1 TRUE
3 1 c 78 90 1 FALSE
4 2 d 27 40 1 FALSE
5 2 e 45 76 1 TRUE
6 2 f 80 100 1 FALSE
我在 block 列中找到了组,而一个组中只有 1 个 anchor。
鉴于anchor == TRUE,如果锚点方向为-1(direction[anchor] == -1),我需要反转(direction * -1)块内的坐标,还需要保持锚点坐标( start & end) 并调整 anchor == FALSE 的其他坐标和坐标以使其保持新月形但具有相同的比例(长度和到上下游标签的距离)。
为了简化,如果组的锚点是-1,我需要重新调整坐标。
这意味着,如果anchor == -1 那么:
ancho * -1- 标签订单必须恢复
- 坐标将改变,保持标签的长度和之间的距离不变
然后,输出只需要像这样:
tibble(
block = c(1,1,1,2,2,2),
tag = c("c", "b", "a", "d", "e", "f"),
start = c(44,54,84,27,45,80),
end = c(56,80,119,40,76,100),
direction = c(-1,1,1,1,1,1),
anchor = c(FALSE,TRUE,FALSE,FALSE,TRUE,FALSE)
) -> df2
# A tibble: 6 x 6
block tag start end direction anchor
<dbl> <chr> <dbl> <dbl> <dbl> <lgl>
1 1 c 44 56 -1 FALSE
2 1 b 54 80 1 TRUE
3 1 a 84 119 1 FALSE
4 2 d 27 40 1 FALSE
5 2 e 45 76 1 TRUE
6 2 f 80 100 1 FALSE
如下所示,长度和对距离保持不变:
df1 %>%
group_by(block) %>%
mutate(
TagDistance = lead(start) - end,
len = end - start
)
# A tibble: 6 x 8
# Groups: block [2]
block tag start end direction anchor TagDistance len
<dbl> <chr> <dbl> <dbl> <dbl> <lgl> <dbl> <dbl>
1 1 a 15 50 -1 FALSE 4 35
2 1 b 54 80 -1 TRUE -2 26
3 1 c 78 90 1 FALSE NA 12
4 2 d 27 40 1 FALSE 5 13
5 2 e 45 76 1 TRUE 4 31
6 2 f 80 100 1 FALSE NA 20
df2 %>%
group_by(block) %>%
mutate(
TagDistance = lead(start) - end,
len = end - start
)
# A tibble: 6 x 8
# Groups: block [2]
block tag start end direction anchor TagDistance len
<dbl> <chr> <dbl> <dbl> <dbl> <lgl> <dbl> <dbl>
1 1 c 44 56 -1 FALSE -2 12
2 1 b 54 80 1 TRUE 4 26
3 1 a 84 119 1 FALSE NA 35
4 2 d 27 40 1 FALSE 5 13
5 2 e 45 76 1 TRUE 4 31
6 2 f 80 100 1 FALSE NA 20
图形表示是这样的:
library(ggplot2)
library(gggenes)
df1 %>%
ggplot(aes(xmin = start, xmax = end, y = as.factor(block), forward = direction, fill = anchor)) +
geom_gene_arrow() +
geom_gene_label(aes(label = tag)) +
theme_genes()
#
df2 %>%
ggplot(aes(xmin = start, xmax = end, y = as.factor(block), forward = direction, fill = anchor)) +
geom_gene_arrow() +
geom_gene_label(aes(label = tag)) +
theme_genes()
提前致谢
【问题讨论】:
-
ld代表什么? -
如果只需要长度,不管方向,跑
mutate(your_data, len = abs(end - start))就够了。不知道我是否遇到了你的问题 -
@lcgodoy
ld是滞后和领先之间的距离tag -
为了更明确,我改为
TagDistance。从某种意义上说,它是同一组内两个邻近标签之间的距离(例如,a到b,b到c,...) -
我不清楚你是如何在
start和end列中获得新数字的。还有direction列中的值是如何变化的。
标签: r dplyr coordinates transform tidyverse