R выбрать несколько файлов из списка файлов по критериям в столбцах и сохранить в новой папке - PullRequest
0 голосов
/ 12 июня 2018

Я имею дело с набором данных, который состоит из более чем 90 000 CSV-файлов.Каждый CSV-файл показывает данные отбора проб конкретного химического вещества, измеренного в конкретном месте отбора проб.Файлы выглядят так:

#csv1
chemical_ID samplingsite    A   result  year    month   
1   1   1   0.5 2008    7
1   1   1   0.5 2008    5
1   1   1   0.5 2008    1
1   1   1   0.3 2008    11
1   1   1   0.5 2010    6
1   1   1   0.4 2010    10
1   1   1   0.5 2010    2
1   1   1   0.5 2010    4
1   1   1   0.4 2013    3
1   1   0   0.2 2013    5
1   1   0   0.1 2013    7
1   1   1   0.5 2013    9
1   1   1   0.4 2014    3
1   1   0   0.2 2014    5
1   1   0   0.1 2014    7
1   1   1   0.5 2014    9

#csv2
chemical_ID samplingsite    A   result  year    month
2   1   1   0.8 2008    6
2   1   1   0.7 2008    9
2   1   1   0.9 2008    11
2   1   1   0.6 2008    12
2   1   1   0.5 2010    2
2   1   1   0.4 2010    5
2   1   1   0.8 2010    6
2   1   1   0.9 2010    8

#csv3
chemical_ID samplingsite    A   result  year    month
100 2   1   1.5 2001    1
100 2   1   1.2 2001    6
100 2   1   1.7 2002    1
100 2   1   0.9 2002    6
100 2   1   1.8 2003    1
100 2   0   1.4 2003    6
100 2   1   1.5 2004    1
100 2   0   1.2 2004    6

Чтобы уменьшить количество файлов, я бы хотел выбрать только те файлы, которые соответствуют определенным критериям, и сохранить их в новой папке.Критерии для каждого химического вещества должны быть следующими:

Number of sampled years > 4
Number of samplings per year >= 4
Number of factor “1” in column “A” per year >= 4

Я пытался, но не могу найти решение для своей задачи, и Google не помог.Это то, что у меня так далеко:

{
mycsv=list.files(path="D:/…/in ", pattern="allyears")
n <- length(mycsv)
mylist <- vector("list", n)

for(i in 1:n)
mylist[[i]] <- read.csv(mycsv[i], header = TRUE)
mylist <- lapply(mylist, FUN=function(x) length(unique(x$year)))
#???

for(i in 1:n)
write.csv(file = paste("D:/…/out", mycsv[i], sep = ""), 
mylist[i], row.names = F)
}

Заранее спасибо
Ниш

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Этот подход получает список ваших файлов, создает функцию для проверки ваших критериев, проверяет, соответствуют ли файлы этим критериям с помощью функции, создает список файлов, соответствующих вашей функции, а затем записывает csvs в новую папку.(что вы, должно быть, создали).

Пример предназначен для работы с csvs в вашем вопросе, когда ни один из них не соответствует вашим критериям, поскольку я их интерпретирую, поэтому добавляется критерий теста, когда csv1 соответствует вашемукритерии.Чтобы отключить их, просто удалите # из ваших критериев и поставьте # перед критериями теста.

file.list <- list.files() # gets list of files - assumes your working directory is where the files are

check.csv <- function(csv.path){ #checks your criteria

  the.csv <- read.csv(file = csv.path, header = TRUE)

  sampled.years <- length(unique(the.csv$year))

  min.samples.per.year <- min(table(the.csv$year))

  min.f1A <- min(table(the.csv$year, the.csv$A)[,"1"])

  #your criteria
  #meets.criteria <- ifelse(sampled.years > 4 & min.samples.per.year >= 4 & min.f1A >=4, TRUE, FALSE) 

  #test criteria
  meets.criteria <- ifelse(sampled.years >= 4 & min.samples.per.year >= 4 & min.f1A >= 2, TRUE, FALSE)

  return(meets.criteria)  
} 

check.files <- sapply(file.list, check.csv) # checks if files meet criteria, as above, assumes that file.list has the whole path, which it will if your working directory is where the files are

files.to.write <- file.list[check.files] # subsets list of files to move

read.write <- function(csv.path){ # function to write csvs into new folder specified in the path as other_folder

  the.csv <- read.csv(file = csv.path, header = TRUE)

  write.csv(the.csv, file = sprintf("other_folder/%s", csv.path))
  # this other_folder must exist
} 


sapply(files.to.write, read.write) # write csvs to new folder
0 голосов
/ 12 июня 2018

Сначала создайте дубликат папки.Затем мы удалим все файлы, которые не соответствуют условиям, указанным выше:

Напишите функцию:

testfile = function(path){
dat= read.csv(path,header=T)
dat1=aggregate(.~year,dat,length)
a=nrow(d)>4
b=d$samplingsite>=4
d=d$A>-4
if(!(a&b&d)) file.remove(path)
}

mycsv=list.files(path="D:/…/in ", pattern="allyears")# Path to the duplicate folder

sapply(mycsv,testfile)
...