首页 > 解决方案 > 分解一个向量,使用 R 中另一个向量的索引

问题描述

我有vector a并且vector b

vector_a <- c(3,2,2,2,2)
vector_b <- c("3a","3b","3c", "2a","2b", "2ab", "2ac","2aab","2aac","2aaab","2aaac")

我想根据vector_a分解vector_b。因此,例如,我想分解vector_b为 5 个元素的列表,使用vector_a.

list_a <- list(one = c("3a","3b","3c"), 
               two = c("2a","2b"), 
               three = c("2ab","2ac"), 
               four = c("2aab","2aac"), 
               five = list(c("2aaab","2aaac"))

我最初涉及循环vector_a并尝试创建一个列表,该列表给出我试图从中提取的索引vector b。所以这样的东西:

iteration_list <- vector(mode = "list", length = length(vector_a_))
counter <- 1
for(i in seq_along(vector_a)) { 
    iteration_list[[i]] <- counter:vector_a[[i]]
    counter <- counter + vector_a[[i]] 
    #Drawing a blank here as I see that the next iteration would go from 4:2
} 

我在迭代部分画了一个空白,我相信必须有一个矢量化函数或者比我实现的更直观的东西。提前致谢!

标签: r

解决方案


这是一个选项split。基于rep将“vector_a”序列与“vector_a”中的值相匹配来创建分组索引,并将其用于split“vector_b”。如果names输出的需要是“一”到“五”,请使用“英语”

library(english)
out <- split(vector_b, rep(seq_along(vector_a), vector_a))
names(out) <- english(seq_along(out))

-输出

out
#$one
#[1] "3a" "3b" "3c"

#$two
#[1] "2a" "2b"

#$three
#[1] "2ab" "2ac"

#$four
#[1] "2aab" "2aac"

#$five
#[1] "2aaab" "2aaac"

如果我们想使用for循环,当我们根据索引对'vector_b'进行子集化时,将'vector_a'的第一个元素与'counter'相加( +)并减去1以将这些元素分配给'iteration_list'的第一个元素ii

counter <- 1
for(i in seq_along(vector_a)) {
   iteration_list[[i]] <- vector_b[counter:(vector_a[i] + counter-1)]
   counter <- counter + vector_a[i]
 }

-输出

iteration_list
#[[1]]
#[1] "3a" "3b" "3c"

#[[2]]
#[1] "2a" "2b"

#[[3]]
#[1] "2ab" "2ac"

#[[4]]
#[1] "2aab" "2aac"

#[[5]]
#[1] "2aaab" "2aaac"

推荐阅读