我想我正在为rbind.fill寻找plyr的类似物(在Hadley的cbind包中)。我看了看,但是没有cbind.fill

我想做的是以下几点:

#set these just for this example
one_option <- TRUE
diff_option <- TRUE

return_df <- data.frame()

if (one_option) {
    #do a bunch of calculations, produce a data.frame, for simplicity the following small_df
    small_df <- data.frame(a=1, b=2)
    return_df <- cbind(return_df,small_df)
}

if (diff_option) {
    #do a bunch of calculations, produce a data.frame, for simplicity the following small2_df
    small2_df <- data.frame(l="hi there", m=44)
    return_df <- cbind(return_df,small2_df)
}

return_df

可以理解,这会产生一个错误:
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 0, 1

我当前的解决方法是将return_df <- data.frame()行替换为return_df <- data.frame(dummy=1),然后该代码起作用。然后,我只需从return_df的最后删除虚拟对象。添加虚拟对象并运行上面的代码后,我得到
      dummy a b        l  m
1     1 1 2 hi there 44

然后我只需要摆脱虚拟对象,例如:
> return_df[,2:ncol(return_df)]
  a b        l  m
1 1 2 hi there 44

我确定我缺少一种更简单的方法来执行此操作。

编辑:我想我不是在寻找cbind.fill,因为那将意味着将在cbind之后创建一个NA值,这不是我想要的。

最佳答案

这是一个绑定(bind)填充:

cbind.fill <- function(...){
    nm <- list(...)
    nm <- lapply(nm, as.matrix)
    n <- max(sapply(nm, nrow))
    do.call(cbind, lapply(nm, function (x)
        rbind(x, matrix(, n-nrow(x), ncol(x)))))
}

让我们尝试一下:
x<-matrix(1:10,5,2)
y<-matrix(1:16, 4,4)
z<-matrix(1:12, 2,6)

cbind.fill(x,y)
cbind.fill(x,y,z)
cbind.fill(mtcars, mtcars[1:10,])

我想我是从某个地方偷来的。

从此处编辑脚本:LINK

关于r - 将数据框与空数据框绑定(bind)-cbind.fill?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7962267/

10-09 12:27