组合两个不同长度的数据帧

Mat*_*att 31 r dataframe

我有两个数据帧.
第一列只有一列10行.
第二个是3列50行.

当我尝试通过使用来组合cbind它时,它会给出以下错误:

data.frame(...,check.names = FALSE)出错:

任何人都可以建议另一个功能吗?
PS我也尝试使用列表,但它给出了同样的错误.

由3列组成的数据框应该是CSV文件中的前3列,而当我使用该write.table函数写入时,具有一列的数据框应该是该文件中的第四列.前3列有50行,第4列应占前10行.

And*_*rie 34

plyr包中有一个函数rbind.fill将合并data.frames并引入NA空单元格:

library(plyr)
combined <- rbind.fill(mtcars[c("mpg", "wt")], mtcars[c("wt", "cyl")])
combined[25:40, ]

    mpg    wt cyl
25 19.2 3.845  NA
26 27.3 1.935  NA
27 26.0 2.140  NA
28 30.4 1.513  NA
29 15.8 3.170  NA
30 19.7 2.770  NA
31 15.0 3.570  NA
32 21.4 2.780  NA
33   NA 2.620   6
34   NA 2.875   6
35   NA 2.320   4
Run Code Online (Sandbox Code Playgroud)


jor*_*ran 21

根据后续评论,我根本不清楚OP实际上是什么.他们实际上可能正在寻找一种将数据写入文件的方法.

但是我们假设我们真正想到cbind了不同长度的多个数据帧.

cbind最终会打电话data.frame,其帮助文件说:

保护由我将在必要时被回收的次数的整数对象传递给data.frame应具有相同的行数,但原子矢量,因素和特征向量(包括作为来自R 2.9.0,列表参数元素).

所以在OP的实际例子中,应该有错误,因为R应该将较短的向量回收到长度为50.实际上,当我运行以下内容时:

set.seed(1)
a <- runif(50)
b <- 1:50
c <- 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)
Run Code Online (Sandbox Code Playgroud)

我没有错误,更短的数据框按预期回收.但是,当我运行这个时:

set.seed(1)
a <- runif(50)
b <- 1:50
c <- 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)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 50, 9
Run Code Online (Sandbox Code Playgroud)

但关于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))
}
Run Code Online (Sandbox Code Playgroud)

可以像这样使用:

set.seed(1)
a <- runif(50)
b <- 1:50
c <- 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)
Run Code Online (Sandbox Code Playgroud)

我不保证这个功能适用于所有情况; 它只是一个例子.

编辑

如果主要目标是创建一个csv或文本文件,那么你需要做的就是改变函数来填充""而不是NA然后做这样的事情:

dat <- cbindPad(dat1,dat2,dat3)
rs <- as.data.frame(apply(dat,1,function(x){paste(as.character(x),collapse=",")}))
Run Code Online (Sandbox Code Playgroud)

然后使用write.tablers.