【问题标题】:R: append table horizontally [closed]R:水平附加表格[关闭]
【发布时间】:2014-10-30 19:37:06
【问题描述】:

我有两个“数据框”,我想将它们附加到一个 csv 文件中。我知道可以使用write。 table 附加它们,但 write.table 垂直附加它们。有没有办法可以水平附加它们?

编辑:这两个数据集是 7x2(恒定)和 Sx7,其中 S 是可变的。 S 可能非常大,可能高达 1000 或更多。

Edit2:我希望它们首先像 Sx7 一样排列,然后是一列空格,然后是 7x2。我不希望它们被转置,因为 S 可能非常大,我希望能够在 LibreOffice/Excel 中读取它们。

【问题讨论】:

  • cbindrbind
  • data.frames 大小不同。
  • @Plinth 从plyr 尝试mergejoin
  • 这些表有什么关系?你到底想用什么来填充空白单元格,然后尺寸不匹配?请创建一个reproducible example,其中包含示例输入和所需的输出。
  • @MrFlick 我刚刚编辑了尺寸。

标签: r append write.table


【解决方案1】:

这绝对是一个快速破解。

您使用 cbind 的问题是数据框的大小不同。解决此问题的一种快速方法是使它们都具有相同的大小,并在空白处填充一些东西,在我的例子中是 NAs 以下。然后您可以 cbind 所有数据帧并将它们作为一个大数据帧输出到文件中。这将使它们看起来是水平添加的,当然还有所有多余的填充物。

#create a list of the dataframes
dfList<-list(df1, df2)
#find the max rows
maxRows<-max(sapply(dfList, nrow))

#define a function that makes all dataframes "cbind-able"

equalRows<-function(df, numRows){
    numColumns<-ncol(df)
    targetRows<-numRows-nrow(df)
    toAppend<-as.data.frame(matrix(rep(NA, numColumns*targetRows), nrow=targetRows, ncol=numColumns))
    colnames(toAppend)<-colnames(df)
    rbind(df, toAppend)
}

#create our new cbind-able dataframes
newdfList<-lapply(dfList, function(df){

            if(nrow(df)==maxRows){
                df
            }else{
                equalRows(df, maxRows)
            }
        })

#put them all in one for output
dfResult<-newdfList[[1]]
for(i in 2:length(newdfList)){
    dfResult<-cbind(dfResult, newdfList[[i]])
}

【讨论】:

  • 谢谢。有点笨拙,但至少它有效!
  • @Plinth 我确信有更好的方法可以做到这一点,这可能无法很好地扩展,而且肯定很笨重!但希望这是一个小问题的快速解决方案。如果您正在为大量数据做很多事情,我会寻求其他途径
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 2013-07-20
相关资源
最近更新 更多