我有一個數字向量串列:
a <- list(c(2, 3, 4, 5, 6, 7), c(4, 5, 6, 7, 8), c(6, 7, 8, 9, 10))
> a
[[1]]
[1] 2 3 4 5 6 7
[[2]]
[1] 4 5 6 7 8
[[3]]
[1] 6 7 8 9 10
我想創建一個串列,其中每個元素對應于原始串列“a”中從 1 到最大值的值。新串列的每個元素中的值是包含焦點值的原始串列中的索引。
例如,結果中的第一個元素包含“a”中值為 1 的索引。因為沒有元素包含 1,所以結果是NULL。第二個元素包含“a”中值為 2 的索引,即第一個元素 1。值 4 位于元素 1 和 2 中。
> res
[[1]]
NULL
[[2]]
[1] 1
[[3]]
[1] 1
[[4]]
[2] 1 2
[[5]]
[2] 1 2
[[6]]
[3] 1 2 3
[[7]]
[3] 1 2 3
[[8]]
[2] 2 3
[[9]]
[1] 3
[[10]]
[1] 3
我用嵌套回圈嘗試過這個,但它花費了太多時間并且回圈中的串列增長非常慢。我的主串列中有 60,000 個子串列,那么是否有針對此的矢量化解決方案?
提前致謝。
uj5u.com熱心網友回復:
這是一個基本的R方式。
lapply(seq.int(max(unique(unlist(a)))), \(i){
which(sapply(a, \(x) any(i == x)))
})
uj5u.com熱心網友回復:
其他方式:
searchInList <- function(list2search, e){
idx2search <- 1:length(list2search)
list2search2 <- lapply(list2search, `length<-`, max(lengths(list2search)))
output <- matrix(unlist(list2search2), ncol = length(list2search2[[1]]), byrow = TRUE)
idx <- apply(output, 1, function(x){ (e %in% x) } )
return(idx2search[idx])
}
result <- lapply(1:max(unlist(a)), function(x) { searchInList(a, x) } )
uj5u.com熱心網友回復:
這是使用matchand 的一種方法rapply。
apply(matrix(rapply(a, \(x) !is.na(match(1:max(unlist(a)), x))),,length(a)), 1, which)
# [[1]]
# integer(0)
#
# [[2]]
# [1] 1
#
# [[3]]
# [1] 1
#
# [[4]]
# [1] 1 2
#
# [[5]]
# [1] 1 2
#
# [[6]]
# [1] 1 2 3
#
# [[7]]
# [1] 1 2 3
#
# [[8]]
# [1] 2 3
#
# [[9]]
# [1] 3
#
# [[10]]
# [1] 3
uj5u.com熱心網友回復:
使用基礎 R 的另一種解決方案:
apply(sapply(a, `%in%`, x = seq_len(max(unlist(a)))), 1, which)
uj5u.com熱心網友回復:
一種tidyverse做法:
library(purrr)
a <- list(c(2, 3, 4, 5, 6, 7), c(4, 5, 6, 7, 8), c(6, 7, 8, 9, 10))
i = 1:10
map(i, ~map_int(imap(a, ~(..3 %in% .x)*.y, i), ~.x[.y], .x) %>% .[. != 0])
邏輯是獲取TRUE值的位置串列,并將其乘以串列元素索引。這里,第一個向量的第一個元素、第二個向量的第一個元素、第三個向量的第三個元素形成所有匹配,因此是目標串列中的第一個元素。
imap(a, ~(..3 %in% .x)*.y, i)
[[1]]
[1] 0 1 1 1 1 1 1 0 0 0
[[2]]
[1] 0 0 0 2 2 2 2 2 0 0
[[3]]
[1] 0 0 0 0 0 3 3 3 3 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/397039.html
上一篇:PlotlyR-根據數值(x軸)在y軸上對資料進行排序
下一篇:以天為單位計算暴露時間
