从第二个数据框中基于数值保留第一个数据框的行。

3
我有两个数据框。其中一个数据框包含四列,第四列包含一个数字,该数字指的是物理位置。
第二个数据框也有四列。这里的第2列和第3列表示边界。
我想保留数据框一中每一行,当V4中指定的数字在数据框二的任何一行中指定的V2和V3之间时。因此,如果数据框一中的62765 V4落在数据框二的20140803-20223538、63549983-63556677或52236330-52315441之间,则应保留整个行;否则将被省略。
我还希望能够执行相反的操作,即当V4不在数据框二的V2和V3之间时保留每一行。在这里任何帮助都将不胜感激。
数据框一:
V1 V2         V3  V4
10 rs11511647  0  62765
10 rs12218882  0  84172
10 rs10904045  0  84426
10 rs11252127  0  88087  

数据框二

V1  V2         V3     V4
 7 20140803 20223538   7A5
19 63549983 63556677  A1BG
10 52236330 52315441  A1CF 

3
在您提供的例子中,数据框1 中的任何值都不落在 数据框2V2V3 之间。 - akrun
3个回答

2
这里有一个简单的方法:
# check whether values of df1$V4 are between df2$V2 and df2$V3
idx <- sapply(df1$V4, function(x) any(x >= df2$V2 & x <= df2$V3))

# remove rows
df1[idx, ]

# retain rows
df1[!idx, ]

太棒了!谢谢你,这正是我所需的。 - user3000124
再次感谢!我有一个后续问题。您能否说明如何使用数据框2中的V4来完成此操作?我想要的是数据框1中每一行,其中V4在数据框2的V2和V3之间,其值为数据框2中指定的值。因此,在这个例子中,我想提取数据框1中从20140803 20223538开始的V4的每一行,然后提取数据框1中V4落在63549983 63556677之间的每一行。我将提取与数据框2中行数相同的数据集。谢谢! - user3000124
@user3000124 你能发一个例子吗? - Sven Hohenstein

1

修改版

使用 @akrun 的数据,并从 @Sven Hohenstein 的代码中获得灵感,这里提供了另一种方法。

df1 <- data.frame(
       V1 = c(10,10,10,10),
       V2 = c("rs11511647","rs12218882","rs10904045", "rs11252127"),
       V3 = c(0,0,0,0),
       V4 = c(62765, 63549985, 84426, 88087),
       stringsAsFactors=FALSE)

df2 <- data.frame(
       V1 = c(7, 19, 10),
       V2 = c(20140803, 63549983, 52236330),
       V3 = c(20223538, 63556677, 52315441),
       V4 = c("7A5", "A1BG", "A1CF"),
       stringsAsFactors=FALSE)

library(dplyr)

df1 %>%
    rowwise %>%
    mutate(test = ifelse(any(V4 >= df2$V2 & V4 <= df2$V3), 1, 0)) %>%
    filter(test == 1)

#  V1         V2 V3       V4 test
#1 10 rs12218882  0 63549985    1

从这个看起来,它假设所有的边界都重叠。但实际上并不是这样,边界之间存在需要保留的间隙。 - user3000124
@user3000124 感谢您的评论。我的错,我没有清楚地阅读您的问题。我在这里更新了另一种方法。 - jazzurro

0

这里有另一种可能性

idx <- sapply(seq(nrow(df1)), function(y) {
    df1$V4[y] > df2[y,2] & df1$V4[y] < df2[y,3]
})
df1[match(TRUE, idx),]
#   V1         V2 V3       V4
# 2 10 rs12218882  0 63549985

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接