莫回无
鉴于后续评论,我尚不清楚OP实际执行的操作。他们实际上可能正在寻找一种将数据写入文件的方法。但是,让我们假设我们确实是在寻找cbind一种不同长度的多个数据帧的方法。cbind最终会致电data.frame,其帮助文件中显示:传递给data.frame的对象应该具有相同的行数,但是,如果有必要,我保护的原子向量,因子和字符向量将被回收多次(包括从R 2.9.0版开始,包括列表参数的元素)。因此在OP的实际示例中,应该不会有错误,因为R应该将较短的向量回收为长度为50的。确实,当我运行以下命令时:set.seed(1)a <- runif(50)b <- 1:50c <- rep(LETTERS[1:5],length.out = 50)dat1 <- data.frame(a,b,c)dat2 <- data.frame(d = runif(10),e = runif(10))cbind(dat1,dat2)我没有任何错误,较短的数据帧也按预期回收。但是,当我运行此命令时:set.seed(1)a <- runif(50)b <- 1:50c <- rep(LETTERS[1:5],length.out = 50)dat1 <- data.frame(a,b,c)dat2 <- data.frame(d = runif(9), e = runif(9))cbind(dat1,dat2)我收到以下错误:Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 50, 9但是R的奇妙之处在于,即使您不希望这样做,也可以使它几乎可以做任何您想做的事情。例如,这是一个简单的函数,它将cbind对长度不均匀的数据帧进行数据处理,并使用NAs 自动填充较短的帧:cbindPad <- function(...){args <- list(...)n <- sapply(args,nrow)mx <- max(n)pad <- function(x, mx){ if (nrow(x) < mx){ nms <- colnames(x) padTemp <- matrix(NA, mx - nrow(x), ncol(x)) colnames(padTemp) <- nms if (ncol(x)==0) { return(padTemp) } else { return(rbind(x,padTemp)) } } else{ return(x) }}rs <- lapply(args,pad,mx)return(do.call(cbind,rs))}可以这样使用:set.seed(1)a <- runif(50)b <- 1:50c <- rep(LETTERS[1:5],length.out = 50)dat1 <- data.frame(a,b,c)dat2 <- data.frame(d = runif(10),e = runif(10))dat3 <- data.frame(d = runif(9), e = runif(9))cbindPad(dat1,dat2,dat3)我不能保证此功能在所有情况下都有效。它仅作为示例。编辑如果主要目标是创建一个csv或文本文件,那么您要做的所有事情都会将功能更改为pad ""而不是NA,然后执行以下操作:dat <- cbindPad(dat1,dat2,dat3)rs <- as.data.frame(apply(dat,1,function(x){paste(as.character(x),collapse=",")}))然后write.table在上使用rs。
慕码人2483693
我的想法是获取所有data.frames的最大行数,然后根据需要将空矩阵追加到每个data.frame。此方法不需要其他程序包,仅使用base。代码如下:list.df <- list(data.frame(a = 1:10), data.frame(a = 1:5), data.frame(a = 1:3))max.rows <- max(unlist(lapply(list.df, nrow), use.names = F))list.df <- lapply(list.df, function(x) { na.count <- max.rows - nrow(x) if (na.count > 0L) { na.dm <- matrix(NA, na.count, ncol(x)) colnames(na.dm) <- colnames(x) rbind(x, na.dm) } else { x }})do.call(cbind, list.df)# a a a# 1 1 1 1# 2 2 2 2# 3 3 3 3# 4 4 4 NA# 5 5 5 NA# 6 6 NA NA# 7 7 NA NA# 8 8 NA NA# 9 9 NA NA# 10 10 NA NA