当前位置: 首页 > 知识库问答 >
问题:

检查列值是否在其他两个列值的(范围)之间

融烨磊
2023-03-14

我有一个看起来像这样的数据帧(Dataframe X):

id  number  found
1   5225    NA
2   2222    NA
3   3121    NA

我有另一个数据框,如下所示(数据帧 Y):

id  number1  number2    
1   4000     6000
3   2500     3300
3   7000     8000

我想做的是:对于Dataframe X“数字”列中的每个值,搜索它是否等于或介于Dataframe Y的“数字1”和“数字2”对值的任何值之间。此外,对于这个“数字1”和“数字2”对值,其各自的“id”必须与Dataframe X中的“id”匹配。如果这都是真的,那么我想在Dataframe X中相应行的“找到”列中插入一个“YES”:

id  number  found
1   5225    YES
2   2222    NA
3   3121    YES

我该怎么做?谢谢你的帮助。

共有3个答案

金嘉言
2023-03-14

使用tidyverse函数,尤其是map_chr来迭代每个数字:

library(tidyverse)
tbl1 <- read_table2(
"id   number  found
1    5225     NA
2    2222     NA
3    3121     NA"
)
tbl2 <- read_table2(
"id  number1  number2
1    4000   6000
2    2500   3300
3    7000   8000"
)

tbl1 %>%
  mutate(found = map_chr(
    .x = number,
    .f = ~ if_else(
      condition = any(.x > tbl2$number1 & .x < tbl2$number2),
      true = "YES",
      false = NA_character_
    )
  ))
#> # A tibble: 3 x 3
#>      id number found
#>   <int>  <int> <chr>
#> 1     1   5225 YES  
#> 2     2   2222 <NA> 
#> 3     3   3121 YES

由reprex包(v0.2.0)于2018-10-18创建。

倪培
2023-03-14

我们可以使用s应用循环遍历每个x$号,并检查它是否位于y$Number1y$Number2任何的范围内,并相应地给出值。

x$found <- ifelse(sapply(x$number, function(p) 
                 any(y$number1 <= p & y$number2 >= p)),"YES", NA)
x

#  id number found
#1  1   5225   YES
#2  2   2222  <NA>
#3  3   3121   YES

使用相同的逻辑但使用替换

x$found <- replace(x$found, 
         sapply(x$number, function(p) any(y$number1 <= p & y$number2 >= p)), "YES")

编辑

如果我们还想比较 id 值,我们可以做

x$found <- ifelse(sapply(seq_along(x$number), function(i) {
           inds <- y$number1 <= x$number[i] & y$number2 >= x$number[i]
           any(inds) & (x$id[i] == y$id[which.max(inds)])
           }), "YES", NA)

x$found
#[1] "YES" NA    "YES"
齐元章
2023-03-14

这里有一个使用< code>fuzzy_join的选项

library(fuzzy_join)
library(dplyr)
fuzzy_left_join(X, Y[-1], by = c("number" = "number1", "number" = "number2"), 
     match_fun  =list(`>=`, `<=`)) %>% 
    mutate(found = c(NA, "YES")[(!is.na(number1)) + 1]) %>% 
    select(names(X))
#    id number found
#1  1   5225   YES
#2  2   2222  <NA>
#3  3   3121   YES

或者另一种选择是与 data.table 的非等值连接

library(data.table)
setDT(X)[, found := NULL]
X[Y, found := "YES", on = .(number >= number1, number <= number2)]
X
#   id number found
#1:  1   5225   YES
#2:  2   2222  <NA>
#3:  3   3121   YES
X <- structure(list(id = 1:3, number = c(5225L, 2222L, 3121L), found = c(NA, 
  NA, NA)), class = "data.frame", row.names = c(NA, -3L))

Y <- structure(list(id = 1:3, number1 = c(4000L, 2500L, 7000L), number2 = c(6000L, 
    3300L, 8000L)), class = "data.frame", row.names = c(NA, -3L))
 类似资料:
  • 本文向大家介绍C#程序在两个列表中查找其他值,包括了C#程序在两个列表中查找其他值的使用技巧和注意事项,需要的朋友参考一下 首先,在C#中设置两个列表。 列表一 列表二 现在,要在两个列表中获得不同的值,请使用Except方法。它返回第二个列表中不存在的第一个列表中的值。 示例 输出结果

  • 问题内容: 在JavaScript中,如果窗口大小大于500px,我要告诉浏览器执行某些操作。我这样做是这样的: 这很好用,但是我想使用相同的方法,但是要有一定范围的数字。因此,如果窗口大小在500像素到600像素之间,我想告诉我的浏览器来做一些事情。我知道这行不通,但是这是我的想象: 在JavaScript中甚至可能吗? 问题答案: 测试是否大于或小于表示值或值本身均不会导致条件变为真。

  • 本文向大家介绍根据MySQL中其他两个列的值来匹配列的值,包括了根据MySQL中其他两个列的值来匹配列的值的使用技巧和注意事项,需要的朋友参考一下 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是根据ID和MatchID显示FirstName的查询- 这将产生以下输出-

  • 在JavaScript中,如果窗口大小大于500px,我会告诉浏览器做些什么。我是这样做的: 这很有效,但我想用同样的方法,但有一系列的数字。所以我想告诉我的浏览器,如果窗口大小在500px到600px之间,我就去做一些事情。我知道这是行不通的,但我是这么想的: 在JavaScript中,这可能吗?

  • 函数“howMany”只是统计了某个特殊的数值的出现次数,有时候我们需要统计每个数值出现的次数。可以用下面这个循环函数完成这项工作。 int numValues = 20; int upperBound = 10; apvector<int> vector = randomVector (numValues, upperBound); cout << "value\thowMany"; for