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

R 组合两个不同长度的数据帧,r,dataframe,R,Dataframe,我有两个数据帧。 第一个仅包含一列和10行。 第二个是3列50行 当我尝试使用cbind组合此项时,会出现以下错误: data.frame(…,check.names=FALSE)中出错: 有人可以建议其他功能来执行此操作吗? 我也尝试过使用列表,但它给出了相同的错误 当我使用write.table函数写入时,包含3列的数据框应该是CSV文件中的前3列,而包含一列的数据框应该是该文件中的第四列。前三列有50行,第四列应该占据前10行。在plyr包中有一个函数rbind.fill,该函数将合并da

我有两个数据帧。
第一个仅包含一列和10行。
第二个是3列50行

当我尝试使用
cbind
组合此项时,会出现以下错误:

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

有人可以建议其他功能来执行此操作吗?
我也尝试过使用列表,但它给出了相同的错误


当我使用
write.table
函数写入时,包含3列的数据框应该是CSV文件中的前3列,而包含一列的数据框应该是该文件中的第四列。前三列有50行,第四列应该占据前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
库(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)

a考虑到后续评论,我根本不清楚OP到底在追求什么。他们可能正在寻找一种将数据写入文件的方法

但是让我们假设我们真的在寻找一种方法来
cbind
不同长度的多个数据帧

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

传递到data.frame的对象应具有相同的行数,但 受I保护的原子向量、因子和字符向量将 如有必要,循环使用一整次(包括从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)
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
但是R的奇妙之处在于,你可以让它做任何你想做的事情,即使你不应该做。例如,这里有一个简单的函数,它将
cbind
长度不均匀的数据帧,并自动用
NA
s填充较短的数据帧:

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

然后使用
rs
上的
write.table
,参考安德烈的答案,建议使用
plyr::rbind.fill()

t()
相结合,您有类似于
cbind.fill()
(不属于
plyr
)的东西,它将考虑相同的案例编号来构建您的数据框架。

我有类似的问题,我匹配了两个数据集的特定列中的条目,并且只有在匹配时才匹配cbind。 对于两个数据集data1和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]
  }
}
for(1中的i:nrow(数据1){
对于(1中的j:nrow(数据2){

如果(data1[i,1]==data2[j,1])data1[i,3]我想我已经想出了一个相当简短的解决方案。希望它能帮助别人

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)

}

cbind.na我的想法是获得所有data.frames的最大行数,然后根据需要将空矩阵附加到每个data.frames。此方法不需要额外的包,只使用base。代码如下所示:

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

list.df仅我的2美分。此代码将两个矩阵或data.frames组合为一个。如果一个数据结构的行数较少,则缺少的行将添加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)

combine.df希望这对您有用

您可以使用
库(qpcR)
组合两个大小不等的矩阵

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

结果_矩阵R在这里正确地返回了一个错误。除非您指定要对额外的行执行什么操作,否则它不知道该执行什么操作。对于不匹配的行,您期望有什么行为?正如@JD所问,您期望有什么行为?也许您正在寻找不同的行为,如
merge()
。请澄清。这些都是Minitab和Excel支持的操作。R更结构化。如果您解释两个data.frames之间的关系,这个问题将更容易解决。较小的前10行是否对应较大的前10行?还是其他一些行?听起来像是
合并
按rowname是您想要的。alex使用cbind而不是rbind。@在我看来,最大的问题是,如果您试图将两个具有不同
nrow
以及
ncol
的data.frame组合在一起,那么无论是
cbind
还是
rbind
,您都会遇到相同的问题。碰巧存在一个潜在的问题使用
rbind
变体的解决方案。这通常是有效的,不是吗?甚至我得到的数据帧都少于(10)行重复到50行,但我想知道是否有任何方法可以只将10行数据帧附加到50行,而不添加任何NA值。谢谢你,嗯,我想我现在明白你的意思了。而你正在谈论制作csv。我想你想要写.csv(…,NA=“”),这样你就不会有“NA”“NA”通过您的csv文件打印。这就是您的意思吗?您好,谢谢您的回复,但是否可以直接加入数据帧而不回收自身或使用NA值?@alex-正如我在回答中所提到的,数据帧是专门针对行数相等的特殊情况的列表。请求行数不等的数据帧是一种排序毫无意义。你想要的是一个列表。@谢谢你……我的主要目的是将一组表发布到csv,这帮助我解决了这个问题。当你有不同列标题的列表时?那么如何组合它们QPCR需要大写字母R才能识别包-->结果矩阵
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)
resultant_matrix <- qpcR:::cbind.na(matrix1, matrix2)