我在目录中有很多具有相同类型列的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
所以,我想做两件事之一:
nrow>=10
的一些条件,同时加入和加入超过10行且相同的没有。列。但是,我无法为所有文件成功添加涉及nrow
的条件。请帮忙。
答案 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)
以查看您拥有的变体数量并进行相应调整。