用sapply替代循环实现不同长度列的绑定
解决方案:提取列表中数据框指定列并补NA合并
你可以通过以下两种方式实现需求:从列表foo的每个数据框中提取y列,合并后对长度不足的部分用NA填充,得到与bar一致的结果。
基础R方案(含do.call搭配cbind的实现)
先提取所有y列,统一补NA到最长长度后,用do.call(cbind, ...)合并:
foo <- list( a = data.frame(x=1:2,y=c(5,4)), b = data.frame(x=1:5,y=c(3,1,4,5,2)), c = data.frame(x=1:3,y=c(8,9,0)) ) # 提取每个数据框的y列 y_cols <- lapply(foo, function(df) df$y) # 获取最长列的长度 max_length <- max(sapply(y_cols, length)) # 将每个y列补NA至最长长度 padded_y <- lapply(y_cols, function(vec) c(vec, rep(NA, max_length - length(vec)))) # 用do.call+cbind合并成矩阵 bar_do_call <- do.call(cbind, padded_y) colnames(bar_do_call) <- names(foo) # 输出结果,与原bar一致 bar_do_call
Tidy风格方案(基于tidyverse)
利用purrr、dplyr和tidyr的函数链实现:
library(tidyverse) foo <- list( a = data.frame(x=1:2,y=c(5,4)), b = data.frame(x=1:5,y=c(3,1,4,5,2)), c = data.frame(x=1:3,y=c(8,9,0)) ) bar_tidy <- foo %>% enframe(name = "group", value = "data") %>% unnest(data) %>% group_by(group) %>% mutate(row_id = row_number()) %>% ungroup() %>% pivot_wider(names_from = group, values_from = y) %>% select(-row_id) %>% as.matrix() # 输出结果 bar_tidy
内容的提问来源于stack exchange,提问作者user111024
相关产品推荐
相关产品推荐

