我有一段代码,我想要解析我的数据。问题是我不会总是有八个数据文件来cbind。我想保留下面的代码并导入五个,如果我有五个。 原因是这个。我将永远有1到100个数据帧到cbind,我不想总是手动告诉R cbind一个或100.我想只有cbind(1:100)并且总是cbind需要什么cbind。
finaltable<- cbind(onea, twoa, threea, foura, fivea, sixa, sevena, eighta)
答案 0 :(得分: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"
这是&#34; hard&#34;部分,阅读文件:
(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]
)来引用列,而无需担心名称