0

我有一段代码,我想绑定我的数据。问题是我不会总是有 8 个数据文件来 cbind。如果我有五个,我想保留下面的代码并只导入五个。原因是这样的。我将始终拥有 1 - 100 个数据帧来 cbind,我不想总是手动告诉 R 来 cbind 1 或 100。我只想拥有 cbind (1:100) 并始终 cbind 需要 cbind 的内容。

finaltable<- cbind(onea, twoa, threea, foura, fivea, sixa, sevena, eighta)
4

1 回答 1

2

没有更多数据,这是一个人为的例子。首先,我将制作一些示例文件,每个文件的行数相同:

filenames <- paste0(c('onea', 'twoa', 'threea', 'foura'), '.csv')
for (fn in filenames)
    write.csv(matrix(runif(5), nc = 1), file = fn, row.names = FALSE)

让我们首先动态导出要处理的文件名列表。(此代码假设之前制作这些文件的行没有发生。)

(filenames <- list.files(pattern = '*.csv'))
##  [1] "foura.csv"  "onea.csv"   "threea.csv" "twoa.csv"  

这是读取文件的“难”部分:

(ret <- do.call(cbind, lapply(filenames,
                              function(fn) read.csv(fn, header = TRUE))))
##           V1        V1        V1        V1
##  1 0.9091705 0.4934781 0.7607488 0.4267438
##  2 0.9692987 0.4349523 0.6066990 0.9134305
##  3 0.6444404 0.8639983 0.1473830 0.9844336
##  4 0.7719652 0.1492200 0.7731319 0.9689941
##  5 0.9237107 0.6317367 0.2565866 0.1084299

对于概念证明,这里是同样的事情,但对文件名向量的一个子集进行操作,表明向量的长度不是问题:

(ret <- do.call(cbind, lapply(filenames[1:2],
                              function(fn) read.csv(fn, header = TRUE))))
##           V1        V1
##  1 0.9091705 0.4934781
##  2 0.9692987 0.4349523
##  3 0.6444404 0.8639983
##  4 0.7719652 0.1492200
##  5 0.9237107 0.6317367

您可能想要/需要重新定义列的名称(names(ret) <- filenames例如,使用 ),但您始终可以通过编号索引(例如,ret[,2])来引用列,而不必担心名称。

于 2014-08-05T21:16:02.313 回答