将相同的功能应用于多个数据框 - R

Apply same function to several Dataframes - R

我目前正在使用 8 个具有相同结构的数据库,我想知道的是如何同时对所有数据库应用相同的步骤和修改。

我知道使用 lapply 函数并将数据库传递给列表是可能的,但我不能指定它。

我需要执行的步骤如下:

df1$EMAIL <- str_to_lower(df1$EMAIL)
df2$EMAIL <- str_to_lower(df2$EMAIL)
dfn$EMAIL <- str_to_lower(dfn$EMAIL)
df8$EMAIL <- str_to_lower(df8$EMAIL)

d1$EMAIL <- stri_trans_general(d1$EMAIL,"Latin-ASCII") 
d2$EMAIL <- stri_trans_general(d2$EMAIL,"Latin-ASCII")
dn$EMAIL <- stri_trans_general(dn$EMAIL,"Latin-ASCII")
d8$EMAIL <- stri_trans_general(d8$EMAIL,"Latin-ASCII")

df1$CATEGORY <- str_to_Title(df1$CATEGORY)
df2$CATEGORY <- str_to_Title(df2$CATEGORY)
dfn$CATEGORY <- str_to_Title(dfn$CATEGORY)
df8$CATEGORY <- str_to_Title(df8$CATEGORY)

df1_e <- select(df1, EMAIL, CATEGORY, COMPANY)
df2_e <- select(df2, EMAIL, CATEGORY, COMPANY)
dfn_e <- select(dfn, EMAIL, CATEGORY, COMPANY)
df8_e <- select(df8, EMAIL, CATEGORY, COMPANY)

EMAILS <- bind_rows(df1_e, df2_e, dfn_e, dfn_8)%>%unique(EMAIL)

它们都是简单的步骤,不需要太多时间来一一执行。但我想学习如何提高效率并在脚本中节省 space 和时间。

提前致谢

您已经确定的通用解决方案是将数据帧放在列表中,并在每个数据帧上使用 lapply/map

这是一个使用 purrr 中的 map_df 的解决方案。如果数据框被称为 df1df2... df8 那么您可以使用 mget 创建数据框列表。我还创建了一个 id 变量,它将为每一行提供数据框名称。

library(dplyr)
library(purrr)

EMAILS <- map_df(mget(paste0('df', 1:8)), function(x) {
  x %>%
    transmute(EMAIL = str_to_lower(EMAIL) %>% stri_trans_general("Latin-ASCII"), 
              CATEGORY = str_to_title(CATEGORY), 
              COMPANY)
}, .id = 'id') %>% distinct(EMAIL, .keep_all = TRUE)