gpt4 book ai didi

r - 范围内的数据框查找值并返回不同的列

转载 作者:行者123 更新时间:2023-12-04 09:45:36 26 4
gpt4 key购买 nike

我有两个数据框,并希望使用其中的值( DF1$pos )来搜索 DF2 中的两列(DF2start、DF2end),如果它落在这些数字内,则返回 DF2$name
DF1

ID   pos  name
chr 12
chr 542
chr 674

DF2
ID   start   end   annot
chr 1 200 a1
chr 201 432 a2
chr 540 1002 a3
chr 2000 2004 a4

所以在这个例子中,我希望 DF1 成为
ID   pos  name
chr 12 a1
chr 542 a3
chr 674 a3

我曾尝试使用合并和相交,但不知道如何使用 if带有逻辑表达式的语句。

数据帧应编码如下,
DF1  <- data.frame(ID=c("chr","chr","chr"),
pos=c(12,542,672),
name=c(NA,NA,NA))

DF2 <- data.frame(ID=c("chr","chr","chr","chr"),
start=c(1,201,540,200),
end=c(200,432,1002,2004),
annot=c("a1","a2","a3","a4"))

最佳答案

也许你可以使用 foverlaps来自“data.table”包。

library(data.table)
DT1 <- data.table(DF1)
DT2 <- data.table(DF2)
setkey(DT2, ID, start, end)
DT1[, c("start", "end") := pos] ## I don't know if there's a way around this step...
foverlaps(DT1, DT2)
# ID start end annot pos i.start i.end
# 1: chr 1 200 a1 12 12 12
# 2: chr 540 1002 a3 542 542 542
# 3: chr 540 1002 a3 674 674 674
foverlaps(DT1, DT2)[, c("ID", "pos", "annot"), with = FALSE]
# ID pos annot
# 1: chr 12 a1
# 2: chr 542 a3
# 3: chr 674 a3

正如@Arun 在评论中提到的,您也可以使用 which = TRUEfoverlaps提取相关值:
foverlaps(DT1, DT2, which = TRUE)
# xid yid
# 1: 1 1
# 2: 2 3
# 3: 3 3
DT2$annot[foverlaps(DT1, DT2, which = TRUE)$yid]
# [1] "a1" "a3" "a3"

关于r - 范围内的数据框查找值并返回不同的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27619381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com