我有一个看起来像这样的数据帧(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
我该怎么做?谢谢你的帮助。
使用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创建。
我们可以使用s应用
循环遍历每个x$号
,并检查它是否位于y$Number1
和y$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"
这里有一个使用< 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