如何识别与向量匹配的行

Éri*_*tto 5 r tibble

我想确定哪一行与向量中的信息匹配。作为一个例子,我将使用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
Run Code Online (Sandbox Code Playgroud)

我想确定哪一行完全匹配。我认为如果它是一个向量会更好,但这将取决于函数是什么;如果是这样的话,那么你只需要as.numeric()在那个choice.

正确的行是 42。

akr*_*run 8

一种选择是Map。用Map,我们比较(==)中相应元件(这里的单位是一个柱)“虹膜”和“选择”的(如选择仅具有单个行,该元素被再循环),返回listlogical,然后将其矢量Reduced的单个逻辑vector&即它检查元素的对应元素list(虹膜的列转换为逻辑),如果所有元素都为真,则返回真),然后换行which以获取该逻辑向量的位置索引

which(Reduce(`&`, Map(`==`, iris, choice)))
#[1] 42
Run Code Online (Sandbox Code Playgroud)

或者另一种选择是复制“选择”的行以使暗度与“虹膜”相同,执行 a ==,使用rowSums并检查它是否等于列数

library(tidyr)
which(rowSums(iris == uncount(choice, nrow(iris))) == ncol(iris))
#[1] 42
Run Code Online (Sandbox Code Playgroud)

或者这可以在tidyverse. 创建一个行号列 ( row_number()),使用filterwithif_all循环遍历除 'rn' 之外的列名,与提取的 'choice' 对应列进行比较,以便仅当该行的所有列都为 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
Run Code Online (Sandbox Code Playgroud)


Alv*_*les 5

这类似于 akrun 的第一个解决方案,我提供了它的 tidyverse 版本:

map2(iris, choice, `==`) %>% 
  reduce(`&`) %>%
  which()

[1] 42

Run Code Online (Sandbox Code Playgroud)