繁体   English   中英

在 R 中的多个列表上应用 function

[英]Apply function on multiple lists in R

我有四个列表,每个列表都有多个数据框。

我需要在列表中应用相同的 function。

我怎样才能做到这一点?

样本数据:

df1 <- data.frame(x = 1:3, y = letters[1:3])
df2 <- data.frame(x = 4:6, y = letters[4:6])
df3 <- data.frame(x = 7:9, y = letters[7:9])
df4 <- data.frame(x = 10:12, y = letters[10:12])
list1 <- list(df1,df2)
list2 <- list(df3,df4)

在我的真实数据中,我根据文件名中的模式导入,因此我的列表元素将具有以下名称(示例数据):

names(list1) <- c("./1. Data/df1.csv", "./1. Data/df2.csv")
names(list2) <- c("./1. Data/df3.csv", "./1. Data/df4.csv")    

这是我想在所有列表上运行的功能之一。

element.name <- function(x) {
  
      all_filenames <- names(x) %>% 
      basename() %>% 
      as.list()

      names(x) <- all_filenames

      names(x) <- gsub("\\.csv", "", names(x))
    }

这将给出所需的 output

names(list1) <- element.name(list1)
names(list1)
[1] "df1"  [2] "df2"

我尝试使用 for 循环,但最终覆盖了我的 output,所以我希望你们中的一些人能帮助我,因为我需要在我的列表中运行很多函数。

您可以创建列表列表,然后使用lapply将 function element.name应用于每个列表。 您可以使用setNames来避免在names上链接分配的问题。 然后,您可以使用list2env让您的 data.frames 回到全局环境。

setNames(list(list1, list2), c('list1', 'list2')) |>
  lapply(function(x) setNames(x, element.name(x))) |>
  list2env()

output

> list1
$df1
  x y
1 1 a
2 2 b
3 3 c

$df2
  x y
1 4 d
2 5 e
3 6 f

> list2
$df3
  x y
1 7 g
2 8 h
3 9 i

$df4
   x y
1 10 j
2 11 k
3 12 l

这是使用data.table::fread的方法

library(data.table)

# create dummy CSVs -------------------------------------------------------
DT1 <- data.frame(x = 1:3, y = letters[1:3])
DT2 <- data.frame(x = 4:6, y = letters[4:6])
DT3 <- data.frame(x = 7:9, y = letters[7:9])
DT4 <- data.frame(x = 10:12, y = letters[10:12])

mapply(write.csv, x = list(DT1, DT2, DT3, DT4), file = list("DT1.csv", "DT2.csv", "DT3.csv", "DT4.csv"), row.names = FALSE)

# read in CSVs ------------------------------------------------------------
csv_paths <- list.files(path = ".", pattern = ".csv$")

# might need to split this into different steps due to different csv formats?
DT_list <- setNames(lapply(csv_paths, fread), tools::file_path_sans_ext(basename(csv_paths)))

# apply a function to each data.table -------------------------------------
lapply(DT_list, function(DT){DT[, test := x*2]})

如果您想坚持使用给定的虚拟数据,只需合并列表:

list1 <- list(df1,df2)
list2 <- list(df3,df4)
DT_list <- setNames(c(list1, list2), tools::file_path_sans_ext(basename(csv_paths)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM