r - 如何识别与向量匹配的行

标签 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
我想确定哪一行完全匹配。我认为如果它是一个向量会更好,但这将取决于函数是什么;如果是这种情况,那么您只需添加 as.numeric()到那个 choice .
正确的行是 42。

最佳答案

一种选择是 Map .与 Map ,我们比较 ( == ) 'iris' 和 'choice' 的对应元素(这里的单位是一列)(因为选择只有一行,该元素被回收),返回一个 listlogical向量然后是 Reduce d 到单个逻辑 vector&即它检查 list 的元素对应元素(iris 的列转换为逻辑),如果所有元素都为 TRUE,则返回 TRUE),然后用 which 换行获取该逻辑向量的位置索引

which(Reduce(`&`, Map(`==`, iris, choice)))
#[1] 42

或者另一种选择是复制“选择”的行以使暗度与“虹膜”相同,执行 == , 使用 rowSums并检查它是否等于列数
library(tidyr)
which(rowSums(iris == uncount(choice, nrow(iris))) == ncol(iris))
#[1] 42

或者这可以在 tidyverse 中完成.创建行号列( row_number() ),使用 filterif_all循环遍历除 'rn' 之外的列名,与提取的相应列 'choice' 进行比较,以便仅当该行的所有列都为 TRUE 时才返回该行( if_allif_any - 是其中之一),pull列 'rn' 作为向量
library(dplyr)
iris %>% 
    mutate(rn = row_number()) %>%  
    filter(if_all(all_of(names(choice)), 
            ~ . == choice[[cur_column()]])) %>%
     pull(rn)
#[1] 42

关于r - 如何识别与向量匹配的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66922621/

相关文章:

r - 合并两个二元变量上的数据框

r - 提取变量分隔符之间的文本

arrays - 如何处理 "non-conformable"数组?

r - 根据组合为列表中的数据框分配名称

r - 将 tibble 作为带有行名称的矩阵展开

r - 如何找到 tibble 列中最长的重复序列?

r - 如何创建具有负轴和正轴的散点图?

r - 将 xts 转换为 tibble 的最佳方法是什么

r - 如何用月份的全名替换数字月份