获取使用purrr::map创建的列表项的名称

获取使用purrr::map创建的列表项的名称,r,tidyverse,purrr,R,Tidyverse,Purrr,我用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

我用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

如何在不使用for循环的情况下检索大列表中单个项目的名称?

使用
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
,但它是
L

的列表元素,您可以利用purrr将所有数据保存在一个嵌套的TIBLE中。这样,每个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)
csv\u文件%
选择(-数据)

名称(所有csv)[42]
例如?另外,使用
基本名称(csv文件)
获取路径的文件名部分<如果
数据路径
”,则code>gsub失败,我尝试此操作时就是这样。@Spacedman这是否决投票的原因吗?正如我所说的,我在避免for循环,因此我不应该使用括号操作符来创建索引[.为了清晰起见,我想你应该说在process_csv_data函数中。
imap
是为了让
map2
的这些用法更性感,你的答案可以简化为:
imap(L,~message(“x是“,.x,“y是“,.y))
另请参见
lmap
,它允许您在
列表元素上循环(长度为1的子列表):
lmap(L,~{message(“x是“,.x[[1]”,.y是“,”名称(.x));返回(列表(NULL))})
这很好,但是通过
all\u csv$processed$name\u of_file
检索数据有点困难。或者,您可以创建一个可直接访问的TIBLES列表:
all\u csv%map(read\u csv)%%>%setNames(csv\u files)
因此只需通过
all\u csv$name\u of_file
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)