【问题标题】:R: find index of (best/incompletely) matching elements in two listsR:在两个列表中查找(最佳/不完全)匹配元素的索引
【发布时间】:2021-03-10 12:13:54
【问题描述】:

我有两个称为 three_lettersfour_letters 的字符向量列表定义为:

three_letters <- replicate(sample(letters, size = 3), n = 100, simplify = FALSE)

four_letters <- sample(three_letters, replace = FALSE, size = 100) %>%
  map(.f = ~ c(., sample(LETTERS, 1)))

three_letters 列表中的每个元素在 four_letters 列表中都有一个对应的元素,共享除一个“子元素”之外的所有字母。

我想生成列表 four_letters 中元素的 INDEX 的一维向量,它匹配(4 个中的 3 个,或者如果可能的话,m 中的广义 n 个)列表中的每个元素 三个字母

我可能想多了,但这是我想出的乏味且非常不可概括的解决方案:

# first define helper function:
count_unique_list <- function(l1_element, l2_element){
  length(unique(unlist(append(l1_element,l2_element))))
}

# use nested map() functions

four_letter_indices <-
# for every element in three_letters:
  map(three_letters, .f = function(x){
    # for every element in four_letters:
    map(four_letters, .f = function(y){
      # is the length of unique union equal to 4?
      count_unique_list(x,y) == 4
    }) %>%
      # return index of TRUE
      detect_index(.f = isTRUE)
  }) %>%
  unlist()

# to check success visually I used cbind on arrayified lists:
cbind(matrix(unlist(three_letters), ncol = 3, byrow = TRUE),
      matrix(unlist(four_letters[four_letter_indices]), ncol = 4, byrow = TRUE))

如果可能的话,我特别喜欢 Hadley-Wickham 风格的“整洁”解决方案,因为这些解决方案对我来说最有意义,并且在我当前的数据分析管道中更易于部署。

干杯

【问题讨论】:

  • count_unique_list() 方法可能看起来有点奇怪。或者,也可以使用以下辅助函数:count_intersection_list &lt;- function(l1_element, l2_element){ length(intersect(unlist(l1_element),unlist(l2_element))) }

标签: r list tidyverse purrr


【解决方案1】:

这是一种方法:

library(tidyverse)
three_letters %>%
  map(~{a = .x;which(map_lgl(four_letters,~all(a %in% .x)))})

我们需要将外部.x 重新分配给一个新变量,因为在嵌套的map 内部.x 将被重新分配给第二级。

{...} 只允许您评估多个表达式并只返回最后一个。表达式由; 或新行分隔。

在tidyevaluation中,~表示lambda函数表达式

function(...)

或者更准确地说,使用~ 创建的公式将转换为函数。 ... 的第一个参数分配给 ..x..1。请参阅help(purrr::map) 了解更多信息。

【讨论】:

  • 聪明!您会将外部 map() 中“{}”的内容称为公式还是函数?而且您正在使用分号来匿名编写多行公式/函数?这很奇怪,但很有意义。您知道提供更多此类示例的资源吗?
  • {...} 只允许您评估多个表达式并且只返回最后一个。表达式由; 或新行分隔。在 tidyevaluation 中,~ 只是表示 lambda 函数表达式(即function(...))。
猜你喜欢
  • 2021-05-19
  • 2014-02-24
  • 2015-08-06
  • 2023-03-24
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
相关资源
最近更新 更多