R: Check if value from dataframe is within range other dataframe

后端 未结 3 920
鱼传尺愫
鱼传尺愫 2021-01-18 05:43

I am looking for a way to look up infromation from 1 dataframe in another dataframe, get a value from that other dataframe and pass it back to the first frame..

exam

相关标签:
3条回答
  • 2021-01-18 06:17

    Here's a simple base method that uses the OP's logic:

    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
    
    0 讨论(0)
  • 2021-01-18 06:24

    Another base method (mostly):

    # we need this for the last line - if you don't use magrittr, just wrap the sapply around the lapply
    library(magrittr)
    
    # get a list of vectors where each item is whether an item's location in y is ok in each to/from in x
    locationok  <- lapply(y$location, function(z) z >= x$from & z <= x$to)
    
    # another list of logical vectors indicating whether y's location matches the number in x
    idok  <- lapply(y$id_number, function(z) z== x$number)
    
    # combine the two list and use the combined vectors as an index on x$name
    lapply(1:nrow(y), function(i) {
          x$name[ locationok[[i]] & idok[[i]]  ]
    }) %>% 
    # replace zero length strings with NA values
    sapply( function(x) ifelse(length(x) == 0, NA, x)
    
    0 讨论(0)
  • 2021-01-18 06:25

    Since you want to match the columns of id_number and number, you can join x and y on the columns and then mutate the name to NA if the location doesn't fall between from and to, here is a dplyr option:

    library(dplyr)
    y %>% left_join(x, by = c("id_number" = "number")) %>% 
          mutate(name = if_else(location >= from & location <= to, as.character(name), NA_character_)) %>% 
          select(-from, -to) %>% arrange(name) %>% 
          distinct(location, id_number, .keep_all = T)
    
    #   location id_number     name
    # 1      1.5        30 region 1
    # 2      2.8        30 region 2
    # 3      2.0        36 region 7
    # 4     10.0        38     <NA>
    # 5      3.5        40     <NA>
    
    0 讨论(0)
提交回复
热议问题