2016-09-16 4 views
1

Ich habe eine große Anzahl von Dateien in mehreren Ordnern. Ich kann eine Liste dieser Dateien mit erhalten;list.files unter Berücksichtigung der Dateigröße in R?

MY_FILES <- list.files(WORKING_DIRECTORY, pattern = "MY_PATTERN", recursive = TRUE) 

Die meisten, aber nicht alle , der Dateien größer als 50 MB. Wie kann ich den Aufruf list.files ändern, so dass MY_FILES nur solche über dem 50Mb-Schwellenwert enthält? Oder benötige ich einen weiteren Schritt, um MY_FILES nachträglich zu unterteilen? (Nicht sicher, wie das geht, weil list.files nur einen Vektor von Namen zurückgibt, gibt es keine Details über die Dateien)

Ich muss bei R bleiben, weil dies nur ein Schritt in einer Reihe von Datenmanipulationen ist. Vielen Dank.

Antwort

5

Sicher, nur Dateigrößen erhalten.

x <- list.files(full.names = TRUE) 

x[sapply(x, file.size) > 300000] 
[1] "./hami.jpg"   "./process_steps.jpg" "./shp_sveta.png" 

Hier unterteile ich nur Dateien, die größer als 300kB sind. Beachten Sie, dass atom.jpg und andere kleinere Dateien nicht in der Teilmenge enthalten sind. Sie sollten full.names Argument verwenden, um auf Dateien zuzugreifen, die nicht in getwd() sind.

enter image description here

+0

Dank @Roman , eine schöne, einfache Methode. Ich habe nicht bemerkt, dass die 'file.size' immer noch mit der Liste verbunden war. Und ich muss wirklich an meinem Verständnis von "sapply" arbeiten. – EcologyTom

+0

@EcologyTom 'sapply' ist einfach, es wendet nur die Funktion an, die Sie für jedes vector/list-Element angeben. –

+0

@EcologyTom: 'file.size' ist ein Funktionsaufruf (im Hilfeindex unter' file.info'), keine intrinsische Eigenschaft der Dateiliste, die Sie aus 'list.files()' erhalten. Die Dateiliste ist nur ein 'dat.frame' von Strings/Zeichenvektoren. – mpag

1

Hier ein Wrapper für list.files ist:

list_files <- function(path=".", pattern=NULL, min_size=50000000, 
         all.files=FALSE, full.names=FALSE, recursive=FALSE, 
         ignore.case=FALSE, include.dirs=FALSE, no..=FALSE) { 

    pre <- list.files(path, pattern, all.files, full.names, recursive, ignore.case, 
        include.dirs, no..) 

    purrr::discard(pre, ~file.size(.)<min_size) 

} 
0

Anstatt Looping (implizit oder explizit), ein vektorisiert Weg, dies zu tun, ist über file.info:

objs <- file.info(list.files("~", full.names=TRUE)) 
rownames(objs)[objs$size > 50e6] 
+0

Sowohl Roman's als auch meine Antwort sind vektorisiert. Vielleicht möchten Sie die Definition von vektorisiert für R nachschlagen, bevor Sie so argumentieren. – hrbrmstr

+0

@hrbrmstr lapply ist nur eine ausgefallene Schleife. –

+0

'.Internal (file.info ...' ist eine 'for' -Schleife auf der C-Ebene. Ich denke, Ihr Code ist dann auch nicht vektorisiert. Mit' * apply' oder 'purrr :: map *' == Vektorisierung. Oder, vielleicht sind Sie nicht mit den R Kernleuten einverstanden, die die 'Vectorize()' Funktion geschrieben haben? (Hätten S-PLUS Leute auch sein können. Ich überprüfe das blaue Buch nach der Arbeit). – hrbrmstr

Verwandte Themen