2017-02-12 182 views
0

我在具有相同結構(即列A,B,C)的目錄中有幾個xlsx文件;每個文件都是一天的數據。 我需要導入R中的所有數據,並找出一天和下一天之間的差異。在R中導入多個xlsx文件

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

我想不出如何使用導入的數據。 例如

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) 

此代碼工作正常,但應該如何與一個變量?

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]) 

我試圖導入一個數據幀中的所有文件,但我對如何使用新的數據

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) 

類似的問題,但我不知道如何這樣做:用一個計數器變量

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

(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

在SO上有很多例子可以正確地做到這一點(並且不會像使用for循環的方式將R視爲Python)。您應該考慮更多地研究如何使用矢量化函數來創建大數據框,然後在幾天之間輕鬆地進行分組和差異化。 – hrbrmstr

+0

請包括所有'庫'行作爲幾個方法這裏不是基地R. – Parfait

+0

庫(data.table)和庫(openxlsx) – Kalel

回答

1

考慮使用基礎R的Map(包裝器mapply)的()和(天+ 1),分別在左側和dplyr::anti_join右側一個數據幀列表之間。當然,最後一天不會有前瞻日比較。

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)