Интерпретация 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)
, поместить все в 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 и FALSE
s, которые фактически соответствуют вашим столбцам, чтобы сохранить и удалить (соответственно) для второго варианта, и "NULL"
и классы объектов для первого варианта.
Интерпретация 2: одинаковая структура данных для каждого CSV
Если структуры данных похожи, но не идентичны, вам может понадобиться использовать вместо них merge
. Рассмотрим следующие примеры данных. Первые три файла имеют одинаковую структуру, но четвертый, "myfile4.txt"
, имеет A, B, D и E в качестве значений «Тип», а остальные три имеют «A», «B», «C» и « Д"
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
, вероятно, приведут к ошибке, если они не могут создавать уникальные имена. Помогите merge
, создав уникальные имена для начальных столбцов без идентификаторов.
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
для 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
person
A5C1D2H2I1M1N2O1R2T1
schedule
08.10.2013
merge
илиmatch
. Если идентично, простойcbind
должен помочь (в R). Удалите первый столбец из всех файлов, кроме первого, приcbind
ing и используйтеmake.names
илиpaste
, чтобы получить уникальные имена для n столбцов. - person A5C1D2H2I1M1N2O1R2T1   schedule 08.10.2013merge
, возможно, в сочетании сdo.call
. - person Ari B. Friedman   schedule 08.10.2013