【发布时间】:2021-03-10 12:13:54
【问题描述】:
我有两个称为 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 的一维向量,它匹配(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 <- function(l1_element, l2_element){ length(intersect(unlist(l1_element),unlist(l2_element))) }