首页 > 解决方案 > 对存储在字符向量中的每个数据帧名称应用函数

问题描述

我的环境中有数据框,并且我已将相同的名称存储在字符向量中。

ldf <- names(which(unlist(eapply(.GlobalEnv,is.data.frame))))

当我打印 ldf 时,它的结构类似于:

>ldf
[1] "tdf1"           "tdf2"
[3] "tdf3" 

我想从每个数据帧中删除具有许多 na 的行。我创建了一个函数,如下所示:

remna <- function(df) {
  df$countofna <- apply(df[,c(1:length(df))], 1,function(x) sum(is.na(x)))
  df <- df[df$countofna <=3, ]
  df$countofna <- NULL
  df <- df[1:nrow(df)-1, ]
}

我如何remna在每个名称存储在ldf. 不使用ldf,我尝试使用 for 循环:

for (i in names(which(unlist(eapply(.GlobalEnv,is.data.frame))))) {
  remna(i)
}

但是,这在执行 remna 时失败,并出现以下错误:

Error in df[, c(1:length(df))] : incorrect number of dimensions

该函数remna在单个数据帧上完美运行。

标签: rapply

解决方案


一种选择是将数据集加载到listwith 中mget并用于rowSums创建一个逻辑向量,用于保留/删除每个数据集中的行

out <- lapply(mget(ldf), function(dat) dat[rowSums(is.na(dat)) <= 3,, drop = FALSE])

如果需要更新原始对象,则使用list2env(虽然不推荐)

list2env(out, .GlobalEnv)

推荐阅读