Saya melakukan analisis yang relatif sederhana yang telah saya masukkan ke dalam suatu fungsi, pada semua file dalam folder tertentu. Saya bertanya-tanya apakah ada yang punya tip untuk membantu saya mengotomatiskan proses pada sejumlah folder yang berbeda.
- Pertama, saya bertanya-tanya apakah ada cara membaca semua file dalam folder tertentu langsung ke R. Saya yakin perintah berikut akan mencantumkan semua file:
files <- (Sys.glob("*.csv"))
... yang saya temukan dari Using R untuk mendaftar semua file dengan ekstensi tertentu
Dan kemudian kode berikut membaca semua file itu menjadi R.
listOfFiles <- lapply(files, function(x) read.table(x, header = FALSE))
… Dari Memanipulasi banyak file di R
Tetapi file tampaknya dibaca sebagai satu daftar terus menerus dan bukan file individual ... bagaimana saya bisa mengubah skrip untuk membuka semua file csv dalam folder tertentu sebagai kerangka data individu?
Kedua, dengan asumsi bahwa saya dapat membaca semua file secara terpisah, bagaimana cara menyelesaikan fungsi pada semua dataframe ini sekaligus. Misalnya, saya telah membuat empat kerangka data kecil sehingga saya dapat mengilustrasikan apa yang saya inginkan:
Df.1 <- data.frame(A = c(5,4,7,6,8,4),B = (c(1,5,2,4,9,1))) Df.2 <- data.frame(A = c(1:6),B = (c(2,3,4,5,1,1))) Df.3 <- data.frame(A = c(4,6,8,0,1,11),B = (c(7,6,5,9,1,15))) Df.4 <- data.frame(A = c(4,2,6,8,1,0),B = (c(3,1,9,11,2,16)))
Saya juga membuat fungsi contoh:
Summary<-function(dfile){
SumA<-sum(dfile$A)
MinA<-min(dfile$A)
MeanA<-mean(dfile$A)
MedianA<-median(dfile$A)
MaxA<-max(dfile$A)
sumB<-sum(dfile$B)
MinB<-min(dfile$B)
MeanB<-mean(dfile$B)
MedianB<-median(dfile$B)
MaxB<-max(dfile$B)
Sum<-c(sumA,sumB)
Min<-c(MinA,MinB)
Mean<-c(MeanA,MeanB)
Median<-c(MedianA,MedianB)
Max<-c(MaxA,MaxB)
rm(sumA,sumB,MinA,MinB,MeanA,MeanB,MedianA,MedianB,MaxA,MaxB)
Label<-c("A","B")
dfile_summary<-data.frame(Label,Sum,Min,Mean,Median,Max)
return(dfile_summary)}
Saya biasanya akan menggunakan perintah berikut untuk menerapkan fungsi ke setiap kerangka data individu.
Df1.summary <-Summary (dfile)
Apakah ada cara selain menerapkan fungsi ke semua dataframe, dan menggunakan judul dataframe di tabel ringkasan (mis. Df1.summary).
Terimakasih banyak,
Katie
plyr::llply
(atauldply
) alih-alihlapply
menyimpan nama di seluruh, dan menentukan fungsi ringkasan saya sendiri, misalnyaplyr::each(min, max, mean, sd, median)
plyr
sarannya.summary
dengan fungsi apa pun milik Anda, asalkan dibutuhkan data.frame sebagai argumen (dan / atau parameter opsional yang konstan di DF perbedaan). Misalnya,lapply(ldf, function(x) apply(x, 2, function(x) c(mean(x), sd(x))))
akan mengembalikan mean dan SD menghitung warna.biasanya saya tidak menggunakan for loop di R, tetapi berikut adalah solusi saya menggunakan for loop dan dua paket: plyr dan dostats
plyr ada di cran dan Anda dapat mengunduh dostat di https://github.com/halpo/dostats (mungkin menggunakan install_github dari paket devtools Hadley )
Dengan asumsi bahwa saya memiliki dua data.frame pertama Anda (Df.1 dan Df.2) dalam file csv, Anda dapat melakukan sesuatu seperti ini.
require(plyr) require(dostats) files <- list.files(pattern = ".csv") for (i in seq_along(files)) { assign(paste("Df", i, sep = "."), read.csv(files[i])) assign(paste(paste("Df", i, sep = ""), "summary", sep = "."), ldply(get(paste("Df", i, sep = ".")), dostats, sum, min, mean, median, max)) }
Ini hasilnya
R> Df1.summary .id sum min mean median max 1 A 34 4 5.6667 5.5 8 2 B 22 1 3.6667 3.0 9 R> Df2.summary .id sum min mean median max 1 A 21 1 3.5000 3.5 6 2 B 16 1 2.6667 2.5 5
sumber
plyr
solusi Anda cukup bagus!Berikut adalah
tidyverse
opsi yang mungkin bukan yang paling elegan, tetapi menawarkan beberapa fleksibilitas dalam hal apa yang disertakan dalam ringkasan:library(tidyverse) dir_path <- '~/path/to/data/directory/' file_pattern <- 'Df\\.[0-9]\\.csv' # regex pattern to match the file name format read_dir <- function(dir_path, file_name){ read_csv(paste0(dir_path, file_name)) %>% mutate(file_name = file_name) %>% # add the file name as a column gather(variable, value, A:B) %>% # convert the data from wide to long group_by(file_name, variable) %>% summarize(sum = sum(value, na.rm = TRUE), min = min(value, na.rm = TRUE), mean = mean(value, na.rm = TRUE), median = median(value, na.rm = TRUE), max = max(value, na.rm = TRUE)) } df_summary <- list.files(dir_path, pattern = file_pattern) %>% map_df(~ read_dir(dir_path, .)) df_summary # A tibble: 8 x 7 # Groups: file_name [?] file_name variable sum min mean median max <chr> <chr> <int> <dbl> <dbl> <dbl> <dbl> 1 Df.1.csv A 34 4 5.67 5.5 8 2 Df.1.csv B 22 1 3.67 3 9 3 Df.2.csv A 21 1 3.5 3.5 6 4 Df.2.csv B 16 1 2.67 2.5 5 5 Df.3.csv A 30 0 5 5 11 6 Df.3.csv B 43 1 7.17 6.5 15 7 Df.4.csv A 21 0 3.5 3 8 8 Df.4.csv B 42 1 7 6 16
sumber
read_csv()
tidak berfungsi dengan baik jadi saya menggantinya dengandata.table::fread()
.