r - R:在两个列表中查找(最佳/不完全)匹配元素的索引
问题描述
我有两个称为three_letters和four_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 的一维向量,该向量与列表three_letters中的每个元素匹配(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 风格的“整洁”解决方案,因为这些解决方案对我来说最有意义,并且在我当前的数据分析管道中更易于部署。
干杯
解决方案
这是一种方法:
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)
更多。
推荐阅读
- asp.net - 使用 aspt.net core 打印
- android - 如何重新连接服务中始终存在的websocket?
- python - 对大查询表的 API 请求
- javascript - $.post 中的 jQuery“错误请求 400”
- angular - 停止点击不起作用Angular 2的指令
- javascript - Ionic 3 Angular Fire payload.val() 返回 null
- php - 为什么与注册相关的注册类型信息显示不正确?
- javascript - 当我没有(明确)指定在 Vue.js 中导入索引文件时,为什么会出现错误?
- python - 熊猫枢轴并加入两个数据框
- powershell - 限制每台计算机的 powershell 作业