r-在全局环境中,在多个但不是所有数据帧上传递函数的简洁方法



我有一些相当大的数据帧,我机器上的RAM无法处理组合数据帧大小的请求/函数。因此,它们每年都在全球环境中。目前,我正在为所有有效的数据帧处理相同的函数,但不知道是否有更简洁的方法。如果我有数据帧:CY_19、CY_20、CY_21、df1、df2;在全球环境中,我一直在做以下代码:

df_21 <- df_21[(df_21$x=='N'),]
df_20 <- df_20[(df_20$x=='N'),]
df_19 <- df_19[(df_19$x=='N'),]
df_19 <- df_19[(df_19$y=='No'),]
df_20 <- df_20[(df_20$y=='No'),]
df_21 <- df_21[(df_21$y=='No'),]

我还运行以下功能:

lines_needed <- function(a, b, c, d, e, f){
CY19 <- a[grep("txt",b, ignore.case = T),]
CY20 <- c[grep("txt",d, ignore.case = T),]
CY21 <- e[grep("txt",f, ignore.case = T),]
CY.all <- rbind(CY19, CY20)
CY.all <- rbind(CY.all, CY21)
return(CY.all)
}
Combined_df <- lines_needed(CY_19, CY_19$z, CY_20, CY_20$z, CY_21, CY_21$z)

还有更简洁的方法吗?

感谢社区的帮助!

在数据帧名称的字符向量上迭代,使用get从其名称中检索每个数据帧,并使用assignrbind检索结果。我们使用ls来获得它们名称的字符向量,但如果您有非常相似的名称,则要排除,要么改进正则表达式,要么用它们名称的显式字符向量替换ls(…(。

nms <- ls(pattern = "^df_")  # c("df_19", "df_20", "df_21")
Sub1 <- function(df) subset(df, x == "N" & y == "No")
for(nm in nms) assign(nm, Sub1(get(nm)))
nms <- ls(pattern = "^CY_")  # c("CY_19", "CY_20", "CY_21")
Sub2 <- function(df) subset(df, grepl("txt", z, ignore.case = TRUE))
combined_df <- do.call("rbind", lapply(nms, function(nm) Sub2(get(nm))))

你没有接近这个权利。如果你创建一个data.frame的列表,然后使用lapply,而不是许多data.frame,你的生活会轻松得多。

最新更新