【发布时间】:2021-11-05 18:38:10
【问题描述】:
我有两个不同大小的数据框:
df1<-data.frame(Chr = c(1, 1,2,3,4),
Start = c(15,120, 210,210,450),
End = c(15,130, 210,210,450),
Gene=c("gene1","gene2","gene3","gene3","gene3"),
sample_id=c("ss6","ss7","ss9","ss9","ss10"))
df2 <- data.frame(Chr = c(1, 1,3),
Start = c(10,100, 200),
End = c(50,200, 250),
Gene=c("gene1","gene2","gene3"),
sample_id=c("ss1","ss1","ss1"))
我想从 df1 获取 Start 并检查它是否在 df2 的 Start-End 范围之间,同时确保 Chr 相同(sample_id 不必匹配)。如果是,则理想情况下使用 df2$sample_id 向 df1 添加一列,但如果这不可能,则为 YES(或 NA 表示不匹配)。 它类似于这个问题,但我也需要匹配'Chr' Only checking range
这也类似于这个问题,我知道它应该更容易,因为我不想匹配各自的行Check if column value is in between (range) of two other column values
我试过了:
df1 %>%
mutate(no_coverage_in = case_when(df2$Start <= Start & df2$End >=Start & Chr == df2$Chr ~ df2$sample_id ))
但它抱怨
较长的对象长度不是较短对象长度的倍数
【问题讨论】:
-
是的,我没有完全正确地问我的问题,所以认为最好删除和改写正确而不是浪费人们的时间
-
您愿意接受 data.table 的答案吗?
df1[df2, on=.(Chr, Start >= Start, Start <= End), hit := i.sample_id]或类似的东西。 -
基因也应该匹配?
-
我得到:未使用的参数(on = .(Chr, Start >= Start, Start