我有一些数据,我试图在dplyr中过滤,但我似乎无法让代码正确完成它。以下是两个数据集:
df1 <- data.frame(Chromosome = c("chr1", "chr1", "chr2", "chr3", "chr4"),
Position = c(5 ,12, 20, 25, 50), stringsAsFactors = FALSE)
> df1
Chromosome Position
1 chr1 5
2 chr1 12
3 chr2 20
4 chr3 25
5 chr4 50
df2 <- data.frame(Chromosome = c("chr1", "chr3"), From = c(1, 20),
To = c(10, 80),stringsAsFactors = FALSE)
> df2
Chromosome From To
1 chr1 1 10
2 chr3 20 80
我想要做的是从第一个表格中选择那些表格之间染色体编号相同的行,并且位置包含在第二个表格中的“From”和“To”之间。所以这里的输出是:
Chromosome Position
1 chr1 5
2 chr3 25
有关如何在R中写这个的任何建议?特别是我喜欢使用dplyr函数,但不是必需的。
答案 0 :(得分:3)
library(dplyr)
left_join(df1, df2) %>%
filter(Position > From, Position < To ) %>%
select(-From, -To)
Chromosome Position
1 chr1 5
2 chr3 25
这假设您的data.frame中没有Chromosome
的重复值,包含From和To。
答案 1 :(得分:0)
如果您对data.table
开放,则可以使用一种方法
library(data.table)
setDT(df1, key="Chromosome")
setDT(df2, key="Chromosome")
df1[ df2, { idx = i.From <= Position & Position <= i.To
.(Position = Position[idx])
},
by=.EACHI
]
# Chromosome Position
#1: chr1 5
#2: chr3 25
受到this answer的启发,前一个我的问题