R:检查数据框的值是否在其他数据框的范围内

Wim*_*pel 5 r

我正在寻找一种方法来从另一个数据帧中的一个数据帧中查找信息,从另一个数据帧中获取一个值,并将其传递回第一帧。

示例数据:

我有一个名为“ x”的数据框

x <- structure(list(from = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L
), to = c(2L, 3L, 4L, 5L, 6L, 2L, 3L, 4L, 5L, 6L), number = c(30, 
30, 30, 33, 34, 35, 36, 37, 38, 39), name = c("region 1", "region 2", 
"region 3", "region 4", "region 5", "region 6", "region 7", "region 8", 
"region 9", "region 10")), .Names = c("from", "to", "number", 
"name"), row.names = c(NA, -10L), class = "data.frame")

#   from to number      name
#1     1  2     30  region 1
#2     2  3     30  region 2
#3     3  4     30  region 3
#4     4  5     33  region 4
#5     5  6     34  region 5
#6     1  2     35  region 6
#7     2  3     36  region 7
#8     3  4     37  region 8
#9     4  5     38  region 9
#10    5  6     39 region 10
Run Code Online (Sandbox Code Playgroud)

该数据框包含有关某些区域的信息(1-10)

我还有另一个数据框“ y”

y <- structure(list(location = c(1.5, 2.8, 10, 3.5, 2), id_number = 
c(30, 30, 38, 40, 36)), .Names = c("location", "id_number"), row.names 
= c(NA, -5L), class = "data.frame")

#  location id_number
#1      1.5        30
#2      2.8        30
#3     10.0        38
#4      3.5        40
#5      2.0        36
Run Code Online (Sandbox Code Playgroud)

这一个包含有关位置的信息。

我需要的是一个函数(或命令,或可以在R;-上抛出的任何东西):对于y中的每一行:查找y $位置是否适合x $ from和x $ to与y $ id_number = = x $ number。如果找到匹配项(位置y只能落入x的1行或0。y不可能存在于y的两行中),则将x $ name返回到y中的新列,命名为“ name

所需的输出:

#  location id_number     name
#1      1.5        30 region 1
#2      2.8        30 region 2
#3     10.0        38     <NA>
#4      3.5        40     <NA>
#5      2.0        36 region 7
Run Code Online (Sandbox Code Playgroud)

我对R很陌生,所以我的第一个想法是使用for循环来解决此问题(就像我以前在VB中所做的那样)。但是后来我想到:“ noooooo”,我必须将其认证,就像所有人都告诉我优秀的R程序员一样;-)

所以我想出了一个函数,并用adply调用了它(来自plyr包)。问题是:它不起作用,向我抛出一个我不明白的错误,现在我被卡住了...

谁能指出我正确的方向?

require("dplyr")

getValue <- function(y, x) {
 tmp <- x %>%
   filter(from <= y$location, to > y$location, number == y$id_number)
 return(tmp$name)
}

y["name"] <- adply(y, 1, getValue, x=x)
Run Code Online (Sandbox Code Playgroud)

Pie*_*une 3

这是一个使用 OP 逻辑的简单基本方法:

f <- function(vec, id) {
  if(length(.x <- which(vec >= x$from & vec <= x$to & id == x$number))) .x else NA
}
y$name <- x$name[mapply(f, y$location, y$id_number)]
y
#  location id_number     name
#1      1.5        30 region 1
#2      2.8        30 region 2
#3     10.0        38     <NA>
#4      3.5        40     <NA>
#5      2.0        36 region 7
Run Code Online (Sandbox Code Playgroud)