R语言如何将向量按每n个元素拆分后按列绑定为数据框
R语言按固定间隔拆分向量为数据框列(tidyverse实现)
不需要写循环,用tidyverse的函数可以快速完成需求,以下是可直接运行的实现方案:
示例复现
先复现你给出的测试案例:测试向量长度12,每3个元素拆分为1列,最终得到3行4列的数据框。
library(tidyverse) # 测试向量 test_vec <- c(1,2,3,4,5,6,7,8,9,10,11,12) # 每组长度,即每列存放的元素个数,示例为3,你的实际场景改为11即可 n_per_col <- 3 # 方法1:逻辑清晰的tidyr宽表转换写法 df1 <- tibble( val = test_vec, col_name = paste0("Race ", rep(1:(length(test_vec)/n_per_col), each = n_per_col)), row_num = rep(1:n_per_col, times = length(test_vec)/n_per_col) ) %>% pivot_wider(names_from = col_name, values_from = val) %>% select(-row_num) # 方法2:更简洁的矩阵转换写法,结果和方法1完全一致 df2 <- test_vec %>% matrix(nrow = n_per_col, byrow = FALSE) %>% as_tibble(.name_repair = ~paste0("Race ", seq_along(.)))
运行后得到的输出和你给出的示例表格完全匹配:
| Race 1 | Race 2 | Race 3 | Race 4 |
|---|---|---|---|
| 1 | 4 | 7 | 10 |
| 2 | 5 | 8 | 11 |
| 3 | 6 | 9 | 12 |
适配你的实际数据
你手里长度为1100、每11个元素为一组的向量,只需要替换向量变量、把n_per_col参数改成11即可:
# 替换为你自己的实际向量 my_vec <- c(...) # 存入你长度1100的目标向量 n_per_col <- 11 final_df <- my_vec %>% matrix(nrow = n_per_col, byrow = FALSE) %>% as_tibble(.name_repair = ~paste0("Race ", seq_along(.)))
注意:运行前确认向量总长度能被每组长度整除即可,你提到的11个为一组的场景属于整除情况,不会出现数值错位问题。如果你的向量实际长度是111000=11000,代码不需要修改,会自动生成1000列、每列11个元素的数据框。
内容的提问来源于stack exchange,提问作者Luke Robins
相关产品推荐
相关产品推荐

