2017-10-24 6 views
-1

私は、purrr :: mapでcsvファイルのリストを取得し、大きなリストを取得しました。purrr :: mapで作成したリスト項目の名前を取得する

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 

Iはさらにprocess_csv_data関数内で別々に各tibble /データ・フレームを処理する必要が@Spacedmanによって示唆されるように編集しました。

purrr::map(all_csv, process_csv_data) 

forループなしで大きなリストの1つの項目の名前を取得するにはどうすればよいですか?この再現性の例のように

+0

例えば '名(all_csv)[42]'気に入りましたか? – Spacedman

+1

また、 'basename(csv_files)'を使用して、パスのファイル名の一部を取得します。 'data_path'が' '' '' 'であれば' gsub'は失敗します。これは私が試したときのものです。 – Spacedman

+0

@Spacedmanダウンボートの理由ですか?私が言ったように、私はforループを避けているので、ブラケット演算子を使用するインデックスを持つべきではありません[。 – Yann

答えて

1

使用map2

> 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 

関数でxとしてリストの出力は、messageによってマングドビットを取得し、しかしLのそのリスト要素。

+0

'imap'は' map2'をよりセクシーにするために考案されました。答えは 'imap(L、〜message(" x is "、.x、" y is "、.y))' –

+0

'lmap'も参照してください。これは' list-elements'(長さ1のサブリスト)をループすることを可能にします: 'lmap(L、〜{message(" x is "、.x [[1] 、名前(.x)); return(リスト(NULL))}) ' –

1

purrrを利用すると、すべてのデータを1つのネストされたティブルに保持できます。その方法は、各CSVファイルと処理CSVは、適切なCSVファイル名と直接連結まま:

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) 
関連する問題