我有很多结构相似的 .csv 文件:
1.csv
Type n
A 1
B 20
C 34
D 5
...
2.csv
Type n
A 2
B 15
C 16
D 5
...
我想将它们组合成类似的东西:
Type n1 n2
A 1 2
B 20 15
C 34 16
D 5 5
...
当我使用 lapply 时,我得到了
Type n Type n
A 1 A 2
B 20 B 15
C 34 C 16
D 5 D 5
...
有什么简单的方法可以正确组合它们吗?
我愿意接受 R 或 Python 中的解决方案
最佳答案
解释一:每个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)
向量子集,将所有内容放入 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
和 FALSE
的向量以保留和删除(分别)第二个选项,以及 “NULL”
和第一个选项的对象类。
解读2:每个CSV的相似数据结构
如果数据结构相似但不相同,您可能需要改用merge
。考虑以下示例数据。前三个文件具有相同的结构,但第四个文件 “myfile4.txt”
的“Type”值是 A、B、D 和 E,而其他三个文件的“Type”值是“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
如果不能生成唯一的名称可能会导致错误。通过为开始的非 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 = "_"))))
使用
Reduce
将“类型”列用作“id”来合并
列表项。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
关于python - 如何将几个类似的 .csv 文件合并到一个具有给定结构的数据框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19246831/