我有一段代码,我想绑定我的数据。问题是我不会总是有 8 个数据文件来 cbind。如果我有五个,我想保留下面的代码并只导入五个。原因是这样的。我将始终拥有 1 - 100 个数据帧来 cbind,我不想总是手动告诉 R 来 cbind 1 或 100。我只想拥有 cbind (1:100) 并始终 cbind 需要 cbind 的内容。
finaltable<- cbind(onea, twoa, threea, foura, fivea, sixa, sevena, eighta)
没有更多数据,这是一个人为的例子。首先,我将制作一些示例文件,每个文件的行数相同:
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]
)来引用列,而不必担心名称。