将操作应用于全局环境中的每个数据框

时间:2018-12-07 13:04:50

标签: r dataframe for-loop global r-mice

我想为我的工作区中的每个数据框创建一个预测矩阵(使用鼠标)。我想做以下事情:

library(mice)
PredMatr = list()
try (for (i in 1:length(ls()))  {
  PredMatr [[i]]=quickpred(get(ls()[i]), mincor=.1)
})

但是,当遇到与工作空间中的数据框不同的内容时,它将停止。我该如何修改代码以使操作取决于作为数据帧的对象?

2 个答案:

答案 0 :(得分:2)

您可以添加

if(!is.data.frame(get(ls()[i]))) next;

对于您的代码,当遇到非data.frame结构时,循环将跳至下一个迭代。

答案

library(mice)
PredMatr = list()
try (for (i in 1:length(ls()))  {

  if(!is.data.frame(get(ls()[i]))) next;

  PredMatr [[i]]=quickpred(get(ls()[i]), mincor=.1)
})

应该做到这一点。

答案 1 :(得分:2)

您可以使用eapply来测试环境中的哪些对象为data.frame类,并且只能使用它们。例如使用:

Myls<-ls(sorted=F)[eapply(.GlobalEnv, class)=="data.frame"]

,现在Mylsdata.frame对象名称的列表。然后可以将它们送入get()

eapply类似于lapply,但它适用于环境中的每个对象,而不是列表中的每个对象。

编辑以添加: 要在原始问题中使用此功能,可以执行以下操作:

library(mice)
PredMatr = list()
Myls<-ls(sorted=F)[eapply(.GlobalEnv, class)=="data.frame"]
try (for (i in 1:length(Myls))  {
  PredMatr [[i]]=quickpred(get(Myls[i]), mincor=.1)
})