从 R 中的 S4 类列表中提取和合并数据帧

Phi*_*rts 0 r dataframe s4

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

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

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

vic = as.data.frame(vi2@vImplist$'1'@vImp) 
Run Code Online (Sandbox Code Playgroud)

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

vic = as.data.frame(vi2@vImplist$'1:400'@vImp) 
Run Code Online (Sandbox Code Playgroud)

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)
}  
Run Code Online (Sandbox Code Playgroud)

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

sta*_*rja 5

根据给定的信息,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)
})
Run Code Online (Sandbox Code Playgroud)

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

output <- do.call("rbind", vic)
Run Code Online (Sandbox Code Playgroud)

编辑

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

vic <- lapply(vi2@vImplist, slot, 'vImp') 
Run Code Online (Sandbox Code Playgroud)