2017-10-24 3 views
-1

Ich habe eine Liste von csv-Dateien mit purrr :: map abgerufen und eine große Liste bekommen.Erhalte den Namen eines Listeneintrags, der mit purrr :: map erstellt wurde

csv_files <- list.files(path = data_path, pattern = '\\.csv$', full.names = TRUE) 
    all_csv <- purrr::map(csv_files, readr::read_csv2) 
    names(all_csv) <- gsub(data_path, "", csv_files) 
    return all_csv 

EDITED wie durch @Spacedman vorgeschlagen

I weiter jedes Tibble/Datenrahmen separat innerhalb der process_csv_data Funktion verarbeiten müssen.

purrr::map(all_csv, process_csv_data) 

Wie wird der Name eines einzelnen Elements in der großen Liste ohne for-Schleife abgerufen?

+0

wie 'Namen (all_csv) [42]' zum Beispiel? – Spacedman

+1

Verwenden Sie 'basename (csv_files)', um den Dateinamen als Teil des Pfades zu erhalten. 'gsub' schlägt fehl, wenn' data_path' ''. "' ist, was es war, als ich das versuchte. – Spacedman

+0

@Spacedman Ist das der Grund für den Downvote? Wie gesagt, ich vermeide eine for-Schleife und daher sollte ich keinen Index haben, um den Klammeroperator [. – Yann

Antwort

1

Verwenden map2, wie in diesem Beispiel reproduzierbaren:

> L = list(a=1:10, b=1:5, c=1:6) 
> map2(L, names(L), function(x,y){message("x is ",x," y is ",y)}) 
x is 12345678910 y is a 
x is 12345 y is b 
x is 123456 y is c 

die Ausgabe der Liste als x in der Funktion wird es ein wenig von munged message, aber das das Listenelement von L.

+0

'imap' wurde entwickelt, um diese Verwendungen von' map2' sexier zu machen, Ihre Antwort kann vereinfacht werden in: 'imap (L, ~ Nachricht (" x ist ", .x," y ist ", .y))' –

+0

siehe auch 'lmap', mit dem man auf 'list-elements' (Unterlisten der Länge 1) loopen kann:' lmap (L, ~ {message ("x is", .x [[1]], "y is" , Namen (.x)); return (Liste (NULL))}) ' –

1

Sie können die Vorteile von purrr nutzen, um alle Daten in einem einzigen verschachtelten Teil zu speichern. Auf diese Weise jede csv und verarbeitet csv direkt mit dem entsprechenden csv-Namen verbunden bleiben:

csv_files <- list.files(path = data_path, pattern = '\\.csv$', full.names = TRUE) 

all_csv <- tibble(csv_files) %>% 
    mutate(data = map(csv_files, read_csv2), 
    processed = map(data, process_csv_data), 
    csv_files = gsub(data_path, "", csv_files)) %>% 
    select(-data) 
Verwandte Themen