解释 1:每个 CSV 的相同数据结构
如果结构相同,请考虑以下两个选项,但首先是一些示例数据:
cat("Type n", "A 1", "B 20", "C 34", "D 5", sep = "\n", file = "myfile1.txt")
cat("Type n", "A 2", "B 15", "C 16", "D 5", sep = "\n", file = "myfile2.txt")
选项 1:在读取数据时删除第一列,方法是使用"NULL"
(带引号)作为colClasses
需要删除的列。用于cbind
将文件放在一起。
x <- read.table("myfile1.txt", header=TRUE)
y <- read.table("myfile2.txt", header=TRUE, colClasses=c("NULL", "numeric"))
cbind(x, y)
# Type n n
# 1 A 1 2
# 2 B 20 15
# 3 C 34 16
# 4 D 5 5
## For more files:
## do.call(cbind, list(x, y, ...))
选项 2:正常读取文件,然后使用c(FALSE, TRUE)
向量进行子集,将所有内容放入 a 中list
,并cbind
与任何对象的第一列一起。
x1 <- read.table("myfile1.txt", header = TRUE)
y1 <- read.table("myfile2.txt", header = TRUE)
fileList <- list(x1, y1)
cbind(x1[1], do.call(cbind, fileList)[c(FALSE, TRUE)])
# Type n n.1
# 1 A 1 2
# 2 B 20 15
# 3 C 34 16
# 4 D 5 5
当然,以上只是最小的例子。我假设您实际上在每个文件中有超过 2 列。使用与您的列实际匹配的TRUE
s 和s 向量来保留和删除(分别)第二个选项,以及第一个选项的对象类。FALSE
"NULL"
解读2:每个CSV的相似数据结构
如果数据结构相似但不相同,则可能需要merge
改用。考虑以下示例数据。前三个文件具有相同的结构,但第四个文件"myfile4.txt"
具有 A、B、D 和 E 作为“类型”值,而其他三个文件具有“A”、“B”、“C”和“D” "
cat("Type n", "A 1", "B 20", "C 34", "D 5", sep = "\n", file = "myfile1.txt")
cat("Type n", "A 2", "B 15", "C 16", "D 5", sep = "\n", file = "myfile2.txt")
cat("Type n", "A 1", "B 5", "C 6", "D 7", sep = "\n", file = "myfile3.txt")
cat("Type n", "A 8", "B 9", "D 11", "E 0", sep = "\n", file = "myfile4.txt")
以下是我们如何解决这个问题。
批量读取文件:
x <- list.files(pattern="myfile")
y <- lapply(x, read.table, header = TRUE)
merge
如果不能创建唯一名称,多个s 可能会导致错误。merge
通过为非 id 列创建唯一名称来帮助启动。
library(data.table) ## for `setnames`
## setnames will silently assign new names
## to the original data in list "y"
invisible(lapply(seq_along(y), function(z)
setnames(y[[z]], "n", paste("n", z, sep = "_"))))
使用“类型”列作为“id”Reduce
来merge
一起列出项目。
Reduce(function(x, y) merge(x, y, by = "Type", all = TRUE), y)
# Type n_1 n_2 n_3 n_4
# 1 A 1 2 1 8
# 2 B 20 15 5 9
# 3 C 34 16 6 NA
# 4 D 5 5 7 11
# 5 E NA NA NA 0