Тълкуване 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
s вероятно ще доведат до грешка, ако не могат да създават уникални имена. Помогнете на 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
елементите от списъка заедно, като използвате колоната „Тип“ като „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
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