r - 分解一个向量,使用 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
}
我在迭代部分画了一个空白,我相信必须有一个矢量化函数或者比我实现的更直观的东西。提前致谢!
解决方案
这是一个选项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'的第一个元素i
i
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"
推荐阅读
- sql-server - 错误 = [Microsoft][SQL Server Native Client 11.0][SQL Server]无效的对象名称“#HashTable”
- database - Firestore 作为真正的多区域数据库
- css - 单独安装 Eva Icons 并保持动态颜色状态
- memory - xarray.Dataset.to_array() 是否将数组加载到内存中,以及从 xarray 中采样小批量的效率如何?
- python - 如何在画布内使用 Tkinter 滚动条
- java - Java - 无法解析构造函数
- amazon-web-services - 何时在 AWS 中通过 API Gateway 使用 Application Load Balancer?
- java - EntityManagerFactory.close() 不关闭 hibernate.connection.datasource-property 设置的 HikariDataSource
- momentjs - MomentJS 没有返回正确的信息
- pyspark - 使用 expr 函数对相反方向的 2 列进行排序不起作用