向向量中每第n个元素后添加值

12

有很多关于如何提取向量中每个第n个元素的问题,但我找不到如何在向量的每个第n个元素后面轻松添加一个值的方法。是否有一种简单的方法在向量的每个第n个元素后面添加某个特定的值?

举个例子,假设我们有两个向量:

v1 <- paste0(letters[1:3], rep(1:5, each = 3))
> v1
[1] "a1" "b1" "c1" "a2" "b2" "c2" "a3" "b3" "c3" "a4" "b4" "c4" "a5" "b5" "c5"

v2 <- paste0("header", seq(1:5))
> v2
[1] "header1" "header2" "header3" "header4" "header5"

现在我想在从第一个开始的每个v1的第三个元素之后添加v2的元素。结果应该像这样:

 [1] "header1" "a1" "b1" "c1" "header2" "a2" "b2" "c2" "header3" "a3" "b3" "c3" "header4" "a4" "b4" "c4" "header5" "a5" "b5" "c5"
2个回答

14

您可以通过设置适当的维度将长向量变成矩阵; 将标头放在顶部; 然后使用c()将矩阵展平为向量。

构建示例:

v1 <- paste0(letters[1:3], rep(1:5, each = 3))
v2 <- paste0("header", seq(1:5))

制作矩阵并附加标题:

r <- rbind(v2,matrix(v1,ncol=length(v2)))
## "header1" "header2" "header3" "header4" "header5"
##    "a1"      "a2"      "a3"      "a4"      "a5"     
##    "b1"      "b2"      "b3"      "b4"      "b5"     
##    "c1"      "c2"      "c3"      "c4"      "c5"     

现在把它压平:

c(r)

8
我们可以使用一个组合变量(由`%/%`创建)将“v1”进行分组,形成一个列表,然后使用`Map`和`unlist`将“v2”的相应元素与该列表连接起来。
unlist(Map(`c`, v2, split(v1, (seq_along(v1)-1)%/%3+1)), use.names=FALSE)
#[1] "header1" "a1"      "b1"      "c1"      "header2" "a2"      "b2"     
#[8] "c2"      "header3" "a3"      "b3"      "c3"      "header4" "a4"     
#[15] "b4"      "c4"      "header5" "a5"      "b5"      "c5"  

如果'v1'的长度是'3'的倍数,我们可以使用'v1'创建一个矩阵cbind 'v2',转置输出并使用c矩阵转换为向量

c(t(cbind(v2,matrix(v1, ncol=3, byrow=TRUE))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接