结合两个不同长度的dataframe

我有两个dataframe。
首先是只有一列和10行。
第二个是3列50行。

当我试图通过使用cbind来结合这个,它会给出这个错误:

data.frame中的错误(…,check.names = FALSE):

任何人都可以build议另外一个功
PS我也试过这个使用列表,但它给出了相同的错误。

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

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 

鉴于后续的评论,我不清楚OP究竟在做什么。 他们实际上可能正在寻找将数据写入文件的方法。

但是,让我们假设我们真的在一个方法上cbind多个不同长度的dataframe。

cbind将最终调用data.frame ,其帮助文件说:

传递给data.frame的对象应该有相同的行数,但是如果有必要的话,primefaces向量,因子和字符向量被保护的次数将被循环使用(包括从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) 

我没有得到任何的错误和较短的数据框架按预期回收。 但是,当我运行这个:

 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) 

我得到以下错误:

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

但关于R的奇妙之处在于,即使不应该,也可以使其几乎做任何事情。 例如,下面是一个简单的函数,可以将不均匀长度的dataframecbind ,并用NA s自动填充较短的dataframe:

 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: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) 

我不能保证这个function在任何情况下都能正常工作。 这仅仅是一个例子。

编辑

如果主要目标是创build一个csv或文本文件,所有你需要做的改变function,以填充使用""而不是NA ,然后做这样的事情:

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

然后在rs上使用write.table

参考Andrie的回答,build议使用plyr::rbind.fill() :结合t()你有类似于cbind.fill() (这不是plyr一部分),将考虑相同的情况数字。

我实际上没有得到这个错误。

 a <- as.data.frame(matrix(c(sample(letters,50, replace=T),runif(100)), nrow=50)) b <- sample(letters,10, replace=T) c <- cbind(a,b) 

我用字母incasejoin所有数字有不同的function(它没有)。 你的'第一个数据框',实际上只是一个vector',只是在第四列重复5次…

但是从专家到问题的所有评论仍然是相关的:)

我想我已经想出了一个相当短的解决scheme..希望它可以帮助别人。

 cbind.na<-function(df1, df2){ #Collect all unique rownames total.rownames<-union(x = rownames(x = df1),y = rownames(x=df2)) #Create a new dataframe with rownames df<-data.frame(row.names = total.rownames) #Get absent rownames for both of the dataframe absent.names.1<-setdiff(x = rownames(df1),y = rownames(df)) absent.names.2<-setdiff(x = rownames(df2),y = rownames(df)) #Fill absents with NAs df1.fixed<-data.frame(row.names = absent.names.1,matrix(data = NA,nrow = length(absent.names.1),ncol=ncol(df1))) colnames(df1.fixed)<-colnames(df1) df1<-rbind(df1,df1.fixed) df2.fixed<-data.frame(row.names = absent.names.2,matrix(data = NA,nrow = length(absent.names.2),ncol=ncol(df2))) colnames(df2.fixed)<-colnames(df2) df2<-rbind(df2,df2.fixed) #Finally cbind into new dataframe df<-cbind(df,df1[rownames(df),],df2[rownames(df),]) return(df) } 

我的想法是获得最大的所有data.frames的行计数,然后将空matrix附加到每个data.frame如果需要。 这种方法不需要额外的包,只有基地被使用。 代码看起来如下:

 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) # aaa # 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 

只是我2美分。 这段代码将两个matrix或data.frames合并为一个。 如果一个数据结构的行数较less,那么丢失的行将被添加NA值。

 combine.df <- function(x, y) { rows.x <- nrow(x) rows.y <- nrow(y) if (rows.x > rows.y) { diff <- rows.x - rows.y df.na <- matrix(NA, diff, ncol(y)) colnames(df.na) <- colnames(y) cbind(x, rbind(y, df.na)) } else { diff <- rows.y - rows.x df.na <- matrix(NA, diff, ncol(x)) colnames(df.na) <- colnames(x) cbind(rbind(x, df.na), y) } } df1 <- data.frame(1:10, row.names = 1:10) df2 <- data.frame(1:5, row.names = 10:14) combine.df(df1, df2) 

希望这会为你工作!

您可以使用library(qpcR)组合两个不相等大小的matrix。

 resultant_matrix <- qpcR:::cbind.na(matrix1, matrix2) 

注: – 由此产生的matrix将是matrix2的大小。

我有类似的问题,我匹配两个数据集的特定列中的条目,只有匹配时才匹配。 对于两个数据集data1&data2,我在比较data2的第一列之后,从data2中的data1中添加一列。

 for(i in 1:nrow(data1){ for( j in 1:nrow(data2){ if (data1[i,1]==data2[j,1]) data1[i,3]<- data2[j,2] } }