【问题标题】:Serializing a List of S4 objects序列化 S4 对象列表
【发布时间】:2021-07-14 09:53:39
【问题描述】:

我有一个 S4 对象列表,我需要一个数据框,其中列表的每个对象都在一行中。我想使用 serialize() 函数进行对象的转换。

object_list # list of S4 objects

objects<-serialize(object_list,connection=NULL)

我的问题是,'objects' 的输出是一个很长的 raw()-vector。 Is 表示所有 S4 对象都在一个 raw() 中转换。 它看起来像这样: [1] 58 0a 00 00 00 03 00 04 00 03 00 03 05 00 00 00 00 05 55 54 46 2d 38 00 01 03 19 00 00 04 02 00 ...

我现在找到了用任何循环解决这个问题的方法。序列化应该采用每个 S4 对象并将其转换,而不是全部放在一个大向量中。

最后,我想在数据框中添加每个向量(来自每个 S4 对象)。

... objects
... 58 0a 00 00 00 03 00 04 00 03
... 00 04 00 03 00 03 05 00 00 00
... ...

希望有人能帮帮我,谢谢!

【问题讨论】:

  • 您介意添加一个可重现的示例吗?
  • ── ClassyFire 对象 ──────────────────────────────────── ────────────────────classyfireR v0.3.6 ── 对象大小:14.9 Kb 信息: • InChIKey=FFRYUAVNPBUEIC-UHFFFAOYSA-N • O=C1NC2=CC=CC =C2N=C1 • 分类版本:2.1 界:有机化合物 └─超类:有机杂环化合物 └─类:二氮杂萘 └─亚类:苯并二嗪 └─5级:喹喔啉
  • 这是对象的一个​​示例,我有一个列表
  • 如果我只序列化列表中的 1 个对象 "serialize(Classification[[1]],connection=NULL)" 我得到它的 raw() 向量,但如果我序列化整个清单 1 我得到一个很大的 raw() 向量,而不是每个对象的向量
  • 我假设可以lapply 覆盖对象列表,serialize 不是对象列表,而是每个对象本身。我仍然看不到一个可重复的示例,可以使用该示例来尝试该想法。试试lapply 和/或阅读stackoverflow.com/help/minimal-reproducible-example

标签: r dataframe serialization s4


【解决方案1】:

缺少一个可重现的例子,假设我们有一个东西的列表

sth <- list(11, 12, 13, 14, 15)

我们有一个函数,它接受一个东西并返回一个原始值:

f <- function(x) return(as.raw(x-10))

要将f 应用于sth 中的每个项目,我们可以使用lapply,如下所示:

lapply(sth, f)

如果您更喜欢先命名函数,Map

Map(f, sth)

两者都会返回一个列表作为结果。如果这个列表可以简化为向量,就像原始列表一样,我们可以使用sapply 而不是lapply

> sapply(sth, f)
[1] 01 02 03 04 05

或在Map 之后致电unlist

> unlist(Map(f, sth))
[1] 01 02 03 04 05

所以现在我们有了可以作为列添加到data.frame 的向量,如下所示。

或者,我们可以使用带有一些变量 ifor 循环,但我们需要一些累加器 acc 来收集循环内不同重复的结果:

acc = NULL      # tell R this is an identifier.
for(i in 1:length(sth))
  acc = append(acc, f(sth[[i]]))        
print(acc)

或者没有append函数:

acc = NULL 
for(i in 1:length(sth))
  acc[i] = f(sth[[i]])        
print(acc)

要使结果向量成为data.frame 中的一列,我们首先需要一个data.frame:

sth <- list(11, 12, 13, 14, 15)

f <- function(x) return(as.raw(x-10))

dafra <- data.frame(id = 1:5, letter = letters[5:9])
dafra$objects = sapply(sth, f)
print(dafra)

【讨论】:

  • 感谢您的详细解答。我使用了以下命令:output &lt;-list(vector()) for (i in 1:length(objects)) { output[[i]] &lt;- serialize(objects[[i]], connection=NULL) } output 现在我在列表中有原始向量。此列表如下所示:`[[1]] 58 0a 00 00 00 03 00 04 00 [[2]] 58 0a 00 00 00 03 00 04 00 03 00 03 05 [[3]] 58 .... . 原始向量有不同的长度。有没有办法将此列表与原始向量转换为数据框? as.dataframe 不起作用,因为行数不同。
  • 我找到了解决方案:data.frame(I(output)) 我需要 I() 函数来创建数据框。
猜你喜欢
  • 2014-12-22
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
相关资源
最近更新 更多