【问题标题】:Applying an operation to every dataframe in the global environment将操作应用于全局环境中的每个数据帧
【发布时间】:2018-12-07 13:04:49
【问题描述】:

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

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

但是当它遇到与工作区中的数据框不同的东西时它会停止。如何调整我的代码以使操作以对象为数据框为条件?

【问题讨论】:

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


    【解决方案1】:

    您可以使用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)
    })
    

    【讨论】:

    • 非常感谢!您能否详细说明如何在我的公式中使用“get”函数?
    • 谢谢约翰保罗!由于某种原因,解决方案不断给出相同的错误。我真的看不出会有什么问题。下面禅先生提供的解决方案确实有效。
    • 我检查了,非数据帧显然仍然出现在Myls 中。
    • 没关系 - 问题是 ls()eapply 将所有内容按不同的顺序排列,更新以防止 ls() 按字母顺序排列名称。我将sorted=F 添加到ls() 函数中。
    • 现在完美运行!接受了这个答案,因为它现在比 Zen 先生的答案更可取,因为它不会创建一个干净的列表(只有预测矩阵),但也有 NULL 值。非常感谢!
    【解决方案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)
    })
    

    应该做的伎俩。

    【讨论】:

    • 非常感谢您的评论!这听起来真的很愚蠢,但是我应该怎么把它放进去(我自己没有完全想出上面的解决方案)。?
    • 更新了我的答案
    • 工作就像一个魅力!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2021-02-28
    • 2012-10-20
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多