【问题标题】:foverlaps data.table || error y's key must be identical to the columns specified in by.yfoverlaps data.table ||错误 y 的键必须与 by.y 中指定的列相同
【发布时间】:2020-08-06 20:04:38
【问题描述】:

我有两个数据框。一个有两列,另一个有三列。第一个数据框具有 SNP 名称及其位置。第二个数据框包含三列,列中包含基因名称以及基因的开始和结束坐标。
我有兴趣根据边界执行连接。如果 SNP 落在基因边界内,则返回它

dt_snp<-data.table("SNP"=c(paste("SNP",seq(1:10),sep="")), 
"BP"=c(1100, 89200, 2500, 33000, 5500, 69500, 12000,8800, 23200, 27000  )) ## SNP data

dt_gene<-data.table("GENE"=c("GENE1","GENE2","GENE3","GENE4","GENE5"), 
"START"=c(1000,2100,5000,40000,23000), "END"=c(2000,3000,9000,45000,30000)) ## Gene data

## do a join using data.table
snp_withingenes<-dt_snp[dt_gene, c("SNP","BP","GENE","START","END"), on=.(BP>=START, BP<=END), nomatch=0] # inner join

我得到了想要的结果,但是当我在存储在 R 包中的 R 脚本中执行此任务时,我收到. 运算符的警告。警告如下:

 function_small: no visible global function definition for ‘.’
  Undefined global functions or variables:
    .

因此,我想使用foverlaps,但我很难理解并使用它达到预期的效果。这对我来说是违反直觉的

foverlaps(dt_snp,dt_gene, by.x=c("SNP","BP"), by.y=c("GENE","START","END"), nomatch=NA, type="any")

Error in foverlaps(dt_snp, dt_gene, by.x = c("SNP", "BP"), by.y = c("GENE",  : 
  The first 3 columns of y's key must be identical to the columns specified in by.y.

我应该如何获得所需的输出?

data.table_1.13.0R v4.0windows平台

R v4.0rmarkdown_2.3devtools_2.3.1UNIX 平台上的 . 运算符来自 devtools 的 check 烦人

【问题讨论】:

  • 难道你不能用on=list(BP&gt;=START, BP&lt;=END) 替换on=.(BP&gt;=START, BP&lt;=END) 并完成它吗?
  • 非常感谢。是的,list 完成了这项工作。 check 发出的 . 警告已经疯狂了 4 个多小时,非常感谢您的回复和 foverlaps 的示例
  • 似乎您的内部连接没有给出正确的 BP 值,而是 dt_gene 的 START 坐标...
  • ...在编辑中修复了这个问题
  • 哦,哇,刚刚注意到了。谢谢~~!!这是为什么?谢谢你抓住那个。如何在不使用您在解决方案中提供的 BP2 列的情况下修复它?

标签: r data.table devtools


【解决方案1】:

为了扩展我的评论,这里是 foverlaps 选项,它需要 data.tables 中的两列,因此在这里似乎不是最理想的:

library(data.table)
dt_snp <- data.table("SNP"=c(paste("SNP",seq(1:10),sep="")), 
                   "BP"=c(1100, 89200, 2500, 33000, 5500, 69500, 12000,8800, 23200, 27000  )) ## SNP data

dt_gene <- data.table("GENE"=c("GENE1","GENE2","GENE3","GENE4","GENE5"), 
                    "START"=c(1000,2100,5000,40000,23000), "END"=c(2000,3000,9000,45000,30000)) ## Gene data
setkey(dt_gene, START, END)

dt_snp[, BP2 := BP]
## do a join using data.table
dt_snp[dt_gene, c("SNP","BP","GENE","START","END"), on=list(BP2 >= START, BP2 <= END), nomatch=0][]
#>      SNP    BP  GENE START   END
#> 1:  SNP1  1100 GENE1  1000  2000
#> 2:  SNP3  2500 GENE2  2100  3000
#> 3:  SNP5  5500 GENE3  5000  9000
#> 4:  SNP8  8800 GENE3  5000  9000
#> 5:  SNP9 23200 GENE5 23000 30000
#> 6: SNP10 27000 GENE5 23000 30000

setkey(dt_snp, BP, BP2)
foverlaps(dt_snp,dt_gene, by.x=c("BP", "BP2"), by.y=c("START","END"), nomatch=NULL, type="any")[, BP2 := NULL][]
#>     GENE START   END   SNP    BP
#> 1: GENE1  1000  2000  SNP1  1100
#> 2: GENE2  2100  3000  SNP3  2500
#> 3: GENE3  5000  9000  SNP5  5500
#> 4: GENE3  5000  9000  SNP8  8800
#> 5: GENE5 23000 30000  SNP9 23200
#> 6: GENE5 23000 30000 SNP10 27000

reprex package (v0.3.0) 于 2020-08-06 创建

【讨论】:

  • 真的很有帮助。学到了很多。 :) 谢谢你的回复~
  • 为什么在连接结束时需要额外的[]?没有它,我不会得到错误,在我这边,输出似乎也很有说服力。我看到 []with foverlaps 以及 list join。
  • 您不需要最后的[] - 它只是在输出中显示结果。如果将其分配给变量,则应省略它。
猜你喜欢
  • 2018-03-17
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2019-02-24
  • 2021-06-05
  • 1970-01-01
相关资源
最近更新 更多