我有一个 S4 班级列表(称为 vi2)。这是它的第一部分:
总共有 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)
有没有人对可能出现的问题有任何建议?
根据给定的信息,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)
| 归档时间: |
|
| 查看次数: |
303 次 |
| 最近记录: |