폴더에있는 모든 파일 열기 및 기능 적용
특정 폴더의 모든 파일에 대해 함수에 넣은 비교적 간단한 분석을 수행하고 있습니다. 많은 다른 폴더에서 프로세스를 자동화하는 데 도움이되는 팁이 있는지 궁금합니다.
- 첫째, 특정 폴더의 모든 파일을 R로 직접 읽는 방법이 있는지 궁금합니다. 다음 명령이 모든 파일을 나열 할 것이라고 생각합니다.
files <- (Sys.glob("*.csv"))
... R을 사용하여 지정된 확장자를 가진 모든 파일을 나열했습니다.
그리고 다음 코드는 모든 파일을 R로 읽습니다.
listOfFiles <- lapply(files, function(x) read.table(x, header = FALSE))
그러나 파일은 개별 파일이 아닌 하나의 연속 목록으로 읽는 것 같습니다. 특정 폴더의 모든 csv 파일을 개별 데이터 프레임으로 열도록 스크립트를 어떻게 변경할 수 있습니까?
둘째, 모든 파일을 개별적으로 읽을 수 있다고 가정하면 이러한 모든 데이터 프레임에서 한 번에 함수를 완료하려면 어떻게해야합니까? 예를 들어, 원하는 것을 설명 할 수 있도록 4 개의 작은 데이터 프레임을 만들었습니다.
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)))
또한 예제 함수를 구성했습니다.
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)}
일반적으로 다음 명령을 사용하여 각 개별 데이터 프레임에 기능을 적용합니다.
Df1.summary <-Summary (dfile)
모든 데이터 프레임에 함수를 적용하는 대신 요약 테이블 (예 : Df1.summary)에서 데이터 프레임의 제목을 사용하는 방법이 있습니까?
감사합니다.
케이티
반대로 작업 list
하면 이러한 작업을 쉽게 자동화 할 수 있다고 생각 합니다.
다음은 하나의 솔루션입니다 (폴더에 네 개의 데이터 프레임을 저장했습니다 temp/
).
filenames <- list.files("temp", pattern="*.csv", full.names=TRUE)
ldf <- lapply(filenames, read.csv)
res <- lapply(ldf, summary)
names(res) <- substr(filenames, 6, 30)
It is important to store the full path for your files (as I did with full.names
), otherwise you have to paste the working directory, e.g.
filenames <- list.files("temp", pattern="*.csv")
paste("temp", filenames, sep="/")
will work too. Note that I used substr
to extract file names while discarding full path.
You can access your summary tables as follows:
> res$`df4.csv`
A B
Min. :0.00 Min. : 1.00
1st Qu.:1.25 1st Qu.: 2.25
Median :3.00 Median : 6.00
Mean :3.50 Mean : 7.00
3rd Qu.:5.50 3rd Qu.:10.50
Max. :8.00 Max. :16.00
If you really want to get individual summary tables, you can extract them afterwards. E.g.,
for (i in 1:length(res))
assign(paste(paste("df", i, sep=""), "summary", sep="."), res[[i]])
usually i don't use for loop in R, but here is my solution using for loops and two packages : plyr and dostats
plyr is on cran and you can download dostats on https://github.com/halpo/dostats (may be using install_github from Hadley devtools package)
Assuming that i have your first two data.frame (Df.1 and Df.2) in csv files, you can do something like this.
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))
}
Here is the output
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
Here is a tidyverse
option that might not the most elegant, but offers some flexibility in terms of what is included in the summary:
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
참고URL : https://stackoverflow.com/questions/9564489/opening-all-files-in-a-folder-and-applying-a-function
'programing' 카테고리의 다른 글
Ctrl + R, Ctrl + R 명령이 작동하지 않음 (0) | 2020.09.22 |
---|---|
정적 키워드의 지원 중단… 더 이상? (0) | 2020.09.22 |
인증을 위해 Facebook을 사용하는 웹 사이트 용 REST API (0) | 2020.09.22 |
Android Studio의 #pragma 마크 해당 (0) | 2020.09.22 |
줄 번호가있는 Git diff (줄 번호가있는 Git 로그) (0) | 2020.09.22 |