如何识别匹配向量的行
How to identify row that matches vector
我想确定哪一行与向量中的信息相匹配。例如,我将使用 iris
数据集(采用 tibble
格式以更好地估计我的情况):iris %>% as_tibble()
。然后我有一个只有一行的小标题,它直接来自原始数据集:
choice <– structure(list(Sepal.Length = 4.5, Sepal.Width = 2.3, Petal.Length = 1.3,
Petal.Width = 0.3, Species = structure(1L, .Label = c("setosa",
"versicolor", "virginica"), class = "factor")), row.names = c(NA,
-1L), class = c("tbl_df", "tbl", "data.frame"))
# A tibble: 1 x 5
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<dbl> <dbl> <dbl> <dbl> <fct>
1 4.5 2.3 1.3 0.3 setosa
我想确定哪一行与此完全匹配。我认为如果它是一个向量会更好,但这将取决于函数是什么;如果是这样的话,那么你只需要在 choice
.
中添加一个 as.numeric()
正确的行是 42。
一个选项是Map
。用Map
,我们比较(==
)'iris'和'choice'对应的元素(这里单位是列)(因为choice只有一行,那个元素被回收),返回 list
的 logical
向量,然后 Reduce
d 到单个逻辑 vector
和 &
即它检查元素对应的元素list
(虹膜的列转换为逻辑),returns 如果所有元素都为真,则为真),然后用 which
换行以获得该逻辑向量的位置索引
which(Reduce(`&`, Map(`==`, iris, choice)))
#[1] 42
或者另一种选择是复制 'choice' 的行以使暗淡与 'iris' 相同,执行 ==
,使用 rowSums
并检查它是否等于列数
library(tidyr)
which(rowSums(iris == uncount(choice, nrow(iris))) == ncol(iris))
#[1] 42
或者这可以在 tidyverse
中完成。创建行号列(row_number()
),用filter
和if_all
循环遍历除'rn'以外的列名,与提取的[=41=对应列进行比较],因此它 returns 仅当该行的所有列都为 TRUE(if_all
、if_any
- 是其中之一时),pull
列 'rn'作为向量
library(dplyr)
iris %>%
mutate(rn = row_number()) %>%
filter(if_all(all_of(names(choice)),
~ . == choice[[cur_column()]])) %>%
pull(rn)
#[1] 42
这类似于akrun的第一个解决方案,我提供了它的tidyverse版本:
map2(iris, choice, `==`) %>%
reduce(`&`) %>%
which()
[1] 42
你可以试试这个
> which(do.call(paste, iris) == do.call(paste, choice))
[1] 42
或
> match(data.frame(t(choice)), data.frame(t(iris)))
[1] 42
我想确定哪一行与向量中的信息相匹配。例如,我将使用 iris
数据集(采用 tibble
格式以更好地估计我的情况):iris %>% as_tibble()
。然后我有一个只有一行的小标题,它直接来自原始数据集:
choice <– structure(list(Sepal.Length = 4.5, Sepal.Width = 2.3, Petal.Length = 1.3,
Petal.Width = 0.3, Species = structure(1L, .Label = c("setosa",
"versicolor", "virginica"), class = "factor")), row.names = c(NA,
-1L), class = c("tbl_df", "tbl", "data.frame"))
# A tibble: 1 x 5
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<dbl> <dbl> <dbl> <dbl> <fct>
1 4.5 2.3 1.3 0.3 setosa
我想确定哪一行与此完全匹配。我认为如果它是一个向量会更好,但这将取决于函数是什么;如果是这样的话,那么你只需要在 choice
.
as.numeric()
正确的行是 42。
一个选项是Map
。用Map
,我们比较(==
)'iris'和'choice'对应的元素(这里单位是列)(因为choice只有一行,那个元素被回收),返回 list
的 logical
向量,然后 Reduce
d 到单个逻辑 vector
和 &
即它检查元素对应的元素list
(虹膜的列转换为逻辑),returns 如果所有元素都为真,则为真),然后用 which
换行以获得该逻辑向量的位置索引
which(Reduce(`&`, Map(`==`, iris, choice)))
#[1] 42
或者另一种选择是复制 'choice' 的行以使暗淡与 'iris' 相同,执行 ==
,使用 rowSums
并检查它是否等于列数
library(tidyr)
which(rowSums(iris == uncount(choice, nrow(iris))) == ncol(iris))
#[1] 42
或者这可以在 tidyverse
中完成。创建行号列(row_number()
),用filter
和if_all
循环遍历除'rn'以外的列名,与提取的[=41=对应列进行比较],因此它 returns 仅当该行的所有列都为 TRUE(if_all
、if_any
- 是其中之一时),pull
列 'rn'作为向量
library(dplyr)
iris %>%
mutate(rn = row_number()) %>%
filter(if_all(all_of(names(choice)),
~ . == choice[[cur_column()]])) %>%
pull(rn)
#[1] 42
这类似于akrun的第一个解决方案,我提供了它的tidyverse版本:
map2(iris, choice, `==`) %>%
reduce(`&`) %>%
which()
[1] 42
你可以试试这个
> which(do.call(paste, iris) == do.call(paste, choice))
[1] 42
或
> match(data.frame(t(choice)), data.frame(t(iris)))
[1] 42