使用purrr::map创建列表项后,获取其名称

11

我使用purrr::map函数检索了一个csv文件列表,得到了一个很大的列表。

  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

按@Spacedman的建议编辑

我需要在process_csv_data函数内单独处理每个tibble/data frame。

purrr::map(all_csv, process_csv_data)
如何在不使用for循环的情况下检索大列表中单个项的名称?

{btsdaf} - Spacedman
1
{btsdaf} - Spacedman
{btsdaf} - Yann
{btsdaf} - Spacedman
2个回答

21

使用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的其中一个元素。


13
imap 的设计是为了让 map2 更具吸引力,您的答案可以简化为:imap(L, ~message("x is ", .x, " y is ", .y)) - moodymudskipper
请参阅 lmap,它允许您在 list-elements(长度为1的子列表)上循环:lmap(L,~ {message("x is ",.x[[1]]," y is ",names(.x));return(list(NULL))}) - moodymudskipper

6
你可以利用purrr将所有数据保存在一个嵌套的tibble中。这样,每个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)

1
这个代码可以正常工作,但是通过 all_csv$processed$name_of_file 检索数据有点麻烦。作为替代方案,您可以创建一个直接可以访问的 tibbles 列表:all_csv <- list.files(path = data_path, pattern = "*.csv", full.names = TRUE) %>% map(read_csv) %>% setNames(csv_files) 这样就可以通过 all_csv$name_of_file 直接获取文件了。 - Agile Bean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接