【问题标题】:Extracting and merging dataframes from an S4 class list in R从 R 中的 S4 类列表中提取和合并数据帧
【发布时间】:2020-09-18 03:54:09
【问题描述】:

我有一个 S4 班级列表(称为 vi2)。这是它的第一部分:

  • @variables:字符 [1:7]
  • @vImplist:400 个列表
    • $1:具有 2 个插槽的正式类“.vImp”
      • @Variables:字符 [1:7]
      • @vImp: 'data.frame': 7 bs。 3个变量:
        • $variables:因子 w/ 7 个级别
          • $Ctest: num [1:7]
          • $Atest: num [1:7]
    • $2:具有 2 个插槽的正式类“.vImp”
      • @Variables:字符 [1:7]
      • @vImp: 'data.frame': 7 bs。 3个变量:
        • $variables:因子 w/ 7 个级别
          • $Ctest: num [1:7]
          • $Atest: num [1:7]

总共有 400 个“.vImp”类,它们都采用相同的格式。我正在尝试做的是提取 '@vImp: 数据。每个类的框架'并将它们合并到一个新的数据框中。我可以使用以下行单独执行此操作:

vic = as.data.frame(vi2@vImplist$'1'@vImp) 

这会生成具有该类正确信息的 data.frame。但是,当我尝试一次为所有 400 个类执行此操作时,它失败了。

vic = as.data.frame(vi2@vImplist$'1:400'@vImp) 

as.data.frame(vi2@vImplist$'1:400'@vImp) 中的错误: 试图从没有槽的基本类(“NULL”)的对象中获取槽“vImp”。

我也尝试使用循环来完成任务。但是,这也因同样的错误而失败:

for (i in seq(from = 1, to = 1, by = 1)) {
vic = as.data.frame(vi2@vImplist$'[i]'@vImp)
output <- rbind(newdf,vic)
}  

是否有人对可能出现的问题有任何建议?

【问题讨论】:

    标签: r dataframe s4


    【解决方案1】:

    根据给定的信息,vImplist 是一个包含 400 个条目的列表,因此您希望访问其中的每个条目。这些条目的名称为 '1'、...、'400'。因此,您的代码 vic = as.data.frame(vi2@vImplist$'1'@vImp) 有效。您通过名称引用列表条目('1' 是一个字符)。当您使用'1:400''[i]' 时,由于'',这也被解释为名称。因为这些 data.frames 不存在,所以返回 NULL,并尝试从中检索插槽“vImp”。这解释了您的错误消息。

    您需要遍历列表的所有条目。最简单的方法是使用 lapply 执行此操作,它对列表的每个条目进行操作,您可以检索正确的插槽:

    vic <- lapply(vi2@vImplist, function(x) {
      as.data.frame(x@vImp)
    })
    

    vic 现在是 data.frames 列表。如果将rbinddo.call 一起使用,则可以直接使用data.frames 列表作为输入参数,因为do.call 接受参数列表:

    output <- do.call("rbind", vic)
    

    编辑

    正如@Rui Barradas 所指出的,vImp 已经是一个 data.frame,所以你不需要as.data.frame。此外,您可以使用slot 直接访问插槽,并将访问的插槽的名称用作函数的进一步参数:

    vic <- lapply(vi2@vImplist, slot, 'vImp') 
    

    【讨论】:

    • 赞成,但考虑到问题中的数据结构,x@vImp 已经是一个 data.frame,lapply(vi2@vImplist, '@', 'vImp') 可能会这样做。无论如何,应该不需要as.data.frame
    • @RuiBarradas 好点,我已将其包含在我的答案中。举个玩具例子,我尝试了lapply(list, '@', 'slot_name'),但它对我不起作用,除非我明确写x@slot_name
    • 好吧,不过lapply(list, slot, 'slot_name') 有效。
    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 2020-05-21
    • 2021-01-23
    相关资源
    最近更新 更多