我有两个数据框。一个数据框由四列组成,第四列包含一个指向物理位置的数字。
第二个数据框也有四列。第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
答案 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