如何在tidyverse中用map_dfc或其他函数列绑定不等长向量?
解决不等长向量列绑定生成数据框的问题
当用map_dfc()尝试列绑定不等长向量时,会因为函数要求输入等长向量而报错(提示无法循环匹配不同长度的向量)。要实现短向量自动补NA、最终生成等长列的数据框,有以下几种实用方法:
方法1:统一向量长度后用map_dfc绑定
先计算所有向量的最长长度,再把每个短向量补NA到该长度,最后用map_dfc完成列绑定:
library(tidyverse) set.seed(0) # 生成原始不等长向量列表 input <- map(1:2, \(i) round(rbeta(4 - if(i==1) 0 else i, i+.1, i+12, i*.2),2)) # 获取最长向量的长度 max_length <- max(lengths(input)) # 补NA后列绑定 result <- map_dfc(input, ~ c(.x, rep(NA, max_length - length(.x)))) result
运行结果与目标输出完全一致:
# A tibble: 4 × 2 ..1 ..2 <dbl> <dbl> 1 0.01 0.24 2 0.08 0.1 3 0.01 NA 4 0.11 NA
如果要直接在生成向量时完成补全,也可以写成:
set.seed(0) max_len <- 4 map_dfc(1:2, \(i) { vec <- round(rbeta(4 - if(i==1) 0 else i, i+.1, i+12, i*.2),2) c(vec, rep(NA, max_len - length(vec))) })
方法2:用tidyr::unnest_wider自动补NA
把向量列表放进一个 tibble 的列表列,再用unnest_wider展开,该函数会自动为短向量填充NA:
library(tidyverse) set.seed(0) input <- map(1:2, \(i) round(rbeta(4 - if(i==1) 0 else i, i+.1, i+12, i*.2),2)) result <- tibble(cols = input) %>% unnest_wider(cols) result
方法3:基础R原生实现
用基础R的length<-强制修改每个向量的长度到最长值,再用cbind转成数据框:
set.seed(0) input <- map(1:2, \(i) round(rbeta(4 - if(i==1) 0 else i, i+.1, i+12, i*.2),2)) max_len <- max(lengths(input)) result <- as.data.frame(lapply(input, `length<-`, max_len)) result
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

