R.根据一秒内的值保留一个数据帧中的行

时间:2014-09-30 13:15:16

标签: r

我有两个数据框。一个数据框由四列组成,第四列包含一个指向物理位置的数字。

第二个数据框也有四列。第2列和第3列是指边界。

当V4中指定的数字落在数据帧2的任何行中指定的V2和V3之间时,我试图保留数据帧1中的每一行。因此,如果来自数据帧1的V4的62765落在20140803-20223538,63549983-63556677或52236330-52315441之间的示例中的数据帧2中,则应该保留整行,否则它将被省略。

我还希望能够执行相反的操作,即当V4不在数据帧2中的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 个答案:

答案 0 :(得分: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, ]

答案 1 :(得分:1)

<强> REVISED

使用@ 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

答案 2 :(得分: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