将csv文件加入R中包含10行以上的目录中

时间:2014-06-19 07:33:17

标签: r csv

我在目录中有很多具有相同类型列的csv文件,我想将它们连接起来形成一个单独的csv文件。现在,以下代码将所有这些代码导入一个数据框:

filenames <- list.files(full.names=TRUE, pattern="*.csv")

abc = do.call(rbind, lapply(filenames, read.table, header = TRUE, sep = ','))

现在,在此目录中,少于10行的csv文件比其他行少一列。因此,当我运行目录中所有文件的代码时,我收到以下错误消息:Error in rbind(deparse.level, ...) : numbers of columns of arguments do not match

所以,我想做两件事之一:

  1. 加入所有文件,不管有哪些列比其他文件少(我相信这有点太多了!) 或者,
  2. 更合理地,涉及nrow>=10的一些条件,同时加入和加入超过10行且相同的没有。列。
  3. 但是,我无法为所有文件成功添加涉及nrow的条件。请帮忙。

2 个答案:

答案 0 :(得分:2)

首先在文件中阅读,但不要rbind()

filenames <- list.files(full.names=TRUE, pattern="*.csv")
files <- lapply(filenames, read.table, header = TRUE, sep = ',')

您可以将数据组合在一起,只要它们都具有相同的列,这样就可以在进行组合之前添加任何缺失的列:

n <- unique(unlist(sapply(files, names)))
cleaned <- lapply(files, function (l) {
  l[, n[!n %in% names(l)]] <- NA
  return (l)
})
do.call(rbind, cleaned)

它会查找所有文件(n)中的每个唯一列,然后在执行rbind()之前确保每个数据框都包含这些列(如果缺少,则列填充NA)。


对于你的第2部分,我不能100%确定你要求的是什么。我认为任何包含10行或更多行的文件具有完全相同的列,并且任何少于10行的文件也具有相同的列。只有那些行数超过十行的rbind(),您可以过滤掉那些不符合该标准的行:

filterRows <- function (x) nrow(x) >= 10
do.call(rbind, Filter(filterRows, files))

或者,如果您希望将多行和少于十行的那些作为单独的集合,则可以执行以下操作:

filters <- c(filterRows, Negate(filterRows))
filtered <- lapply(filters, Filter, files)
result <- lapply(filtered, function(l) do.call(rbind, l))

result第一个元素中包含所有&gt; = 10行数据,第二个元素中包含所有其他文件。

答案 1 :(得分:1)

filenames <- list.files(full.names=TRUE, pattern="*.csv")
dfs <- lapply(filenames, read.table, header = TRUE, sep = ',')
dfs1 <- do.call(rbind, datasets[sapply(datasets, nrow) != 10]
dfs2 <- do.call(rbind, datasets[sapply(datasets, nrow) == 10]

这假设所有少于10列的列具有相同的列数(比如9)。否则,您可以检查sapply(datasets, nrow)以查看您拥有的变体数量并进行相应调整。