在R语言中如何将不等长列表/向量的元素分配到指定行数?
问题描述
我创建了一个包含10个元素的向量:
number_of_items = 10 list_of_items <- do.call('paste0', expand.grid("q", c(1:number_of_items))) list_of_items # [1] "q1" "q2" "q3" "q4" "q5" "q6" "q7" "q8" "q9" "q10"
我希望将这些元素分配到4行中,最终效果如下:
> q1 q5 q9 > q2 q6 q10 > q3 q7 > q4 q8
我通过循环结合paste函数实现了需求:
number_of_rows = 4 strings = rep("", times=number_of_rows) j = 1 for (i in 1:number_of_items) { strings[j] = paste(strings[j], list_of_items[i], sep = "+") j = j+1 if (j > number_of_rows ) { j = 1} } substring(strings,2) # [1] "q1+q5+q9" "q2+q6+q10" "q3+q7" "q4+q8"
作为R语言新手,我想知道是否有更简洁优雅的实现方式?
简洁实现方案
方案1:矩阵转置 + apply 组合
利用矩阵按列填充的特性,转置后逐行拼接,自动处理元素分配:
number_of_rows <- 4 # 将向量按列填充为4行矩阵,空缺位置补NA mat <- matrix(list_of_items, nrow = number_of_rows) # 转置后过滤NA并拼接每行元素 sapply(t(mat), function(x) paste(x[!is.na(x)], collapse = "+")) # 输出: # [1] "q1+q5+q9" "q2+q6+q10" "q3+q7" "q4+q8"
方案2:split 分组拼接
通过生成循环分组索引,将向量拆分后直接拼接每组元素:
number_of_rows <- 4 # 生成循环分组标签:1,2,3,4,1,2,3,4,1,2 groups <- rep(1:number_of_rows, length.out = length(list_of_items)) # 按分组拆分后拼接每组 sapply(split(list_of_items, groups), paste, collapse = "+") # 输出: # 1 2 3 4 # "q1+q5+q9" "q2+q6+q10" "q3+q7" "q4+q8"
方案3:tidyverse 风格写法(需加载purrr)
如果习惯使用tidyverse工具,用map可以一行完成:
library(purrr) number_of_rows <- 4 map_chr(1:number_of_rows, ~paste(list_of_items[seq(.x, length(list_of_items), number_of_rows)], collapse = "+")) # 输出: # [1] "q1+q5+q9" "q2+q6+q10" "q3+q7" "q4+q8"
这些方案都利用了R的向量化操作或分组功能,避免了手动循环,代码更简洁且符合R语言的惯用写法。
内容的提问来源于stack exchange,提问作者kwadratens
相关产品推荐
相关产品推荐

