如何按名称模式合并不同长度向量,避免循环填充留空值?
按名称模式合并不同长度向量(缺失列留空)
核心需求
将名称符合特定模式的多个不同长度向量按行合并,较短向量的缺失列填充NA而非循环重复元素。
解决方案(使用dplyr)
library(dplyr) # 获取所有名称匹配"million_cities_"模式的向量 city_vectors <- mget(ls(pattern = "million_cities_")) # 计算所有向量中的最长长度 max_col_count <- max(sapply(city_vectors, length)) # 将每个向量转换为单行数据框,补全NA single_row_dfs <- lapply(city_vectors, function(vec) { padded_vec <- c(vec, rep(NA, max_col_count - length(vec))) as.data.frame(t(padded_vec), stringsAsFactors = FALSE) }) # 合并所有单行数据框,保留原向量名称作为分组列 final_result <- bind_rows(single_row_dfs, .id = "country") print(final_result)
输出示例
country V1 V2 V3 V4 V5 V6 V7 V8 V9 1 million_cities_USA New York Los Angeles Chicago Houston Phoenix Philadelphia San Antonio San Diego Dallas 2 million_cities_UK London Birmingham <NA> <NA> <NA> <NA> <NA> <NA> <NA> 3 million_cities_Canada Toronto Montreal Calgary Ottawa Edmonton <NA> <NA> <NA> <NA>
基础R替代方案
如果不依赖dplyr,用基础R代码也能实现:
# 获取目标向量列表 city_vectors <- mget(ls(pattern = "million_cities_")) max_col_count <- max(sapply(city_vectors, length)) # 补全向量并合并为矩阵 city_matrix <- do.call(rbind, lapply(city_vectors, function(vec) { c(vec, rep(NA, max_col_count - length(vec))) })) # 转换为数据框并添加分组列 final_result <- as.data.frame(city_matrix, stringsAsFactors = FALSE) final_result$country <- rownames(final_result) rownames(final_result) <- NULL print(final_result)
关键说明
mget(ls(pattern = "xxx")):快速批量获取名称匹配特定模式的对象- 补全
NA的逻辑:通过计算最长向量长度,给短向量补充对应数量的NA,确保所有向量长度一致 - 转置操作
t():将向量转换为单行结构,避免直接转数据框时变成列
内容的提问来源于stack exchange,提问作者agermanguy
相关产品推荐
相关产品推荐

