2017-02-12 2 views
0

Ich habe mehrere Xlsx-Dateien in einem Verzeichnis mit der gleichen Struktur (d. H. Spalte A, B, C); Jede Datei ist die Daten eines Tages. Ich muss alle Daten in R importieren und die Unterschiede zwischen einem Tag und dem nächsten finden.Importieren Sie mehrere Xlsx-Datei in R

files <- list.files(pattern = ".xlsx") 
for (i in seq_along(files)) { 
    assign(paste("Day", i, sep = "."), read.xlsx(files[i])) 
} 

Ich kann nicht herausfinden, wie man die importierten Daten verwendet. Zum Beispiel

Day.1 <- data.frame(Day.1) 
Day.1$A <- as.character(Day.1$A) 
Day.2 <- data.frame(Day.2) 
Day.2$A <- as.character(Day.2$A) 
anti_join (Day.1, Day.2) 

Dieser Code funktioniert gut, aber wie sollte es mit einer variabel sein?

Day.[i] <- data.frame(Day.[i]) 
Day.[i]$A <- as.character(Day.[i]$A) 
Day.[i+1] <- data.frame(Day.[i+1]) 
Day.[i+1]$A <- as.character(Day.[i+1]$A) 
anti_join (Day.[i], Day.[i+1]) 

Ich habe versucht, alle Dateien in einem einzigen Datenrahmen zu importieren, aber ich habe ein ähnliches Problem, wie die neuen Daten verwenden

file.list <- list.files(pattern='*.xlsx') 
days.list <- lapply(file.list, read_excel) 
days <- rbindlist(days.list, idcol = "id") 
days <- data.frame(days) 
days$B <- as.character(days$B) 

Aber ich weiß nicht, wie man so etwas wie:

day1 <- filter(days, id==1) 
day2 <- filter(days, id==2) 
diff1 <- anti_join (day1, day2, by=c("B", "C")) 

eine Zählvariable mit (i)

day(i) <- filter(days, id==(i)) 
day(i+1) <- filter(days, id==(i+1)) 
diff1 <- anti_join (day1, day2, by=c("B", "C")) 
+0

Es gibt zahlreiche Beispiele auf SO dies richtig zu machen (und nicht behandeln R wie Python mit 'for' Schleifen). Sie sollten darüber nachdenken, wie Sie vektorisierte Funktionen verwenden können, um einen großen Datenrahmen zu erstellen, und dann einfach zwischen Tagen gruppieren und Diffs erstellen. – hrbrmstr

+0

Bitte alle 'library' Zeilen einbeziehen. Einige Methoden sind hier nicht Basis R. – Parfait

+0

Bibliothek (data.table) und Bibliothek (openxlsx) – Kalel

Antwort

1

Betrachten Map Base R (Wrapper mapply) zwischen einer Liste von Datenrahmen (Tage) und (Tage + 1), die jeweils auf der linken und rechten Seite des dplyr::anti_join verwenden. Natürlich wird der allerletzte Tag keinen Vortagesvergleich haben.

library(xlsx) 
library(dplyr) 

file.list <- list.files(pattern='*.xlsx') 
df.list <- lapply(file.list, function(f){ 
    read.xlsx(f, 1, stringsAsFactors = FALSE) 
}) 

left_days <- df.list[1:length(df.list)-1] # SUBSET OUT LAST DAY 
right_days <- df.list[2:length(df.list)]  # SUBSET OUT FIRST DAY 

# WITHOUT ARGS 
anti_join_list <- Map(anti_join, left_days, right_days) 

# WITH ARGS 
anti_join_list <- Map(function(x,y) anti_join(x, y, by=c("B", "C")), left_days, right_days) 
Verwandte Themen