将相同的功能应用于多个数据框 - 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
的解决方案。如果数据框被称为 df1
、df2
... 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)
我目前正在使用 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
的解决方案。如果数据框被称为 df1
、df2
... 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)