我有一个 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我现在找到了用任何循环解决这个问题的方法。序列化应该对每个 S4 对象进行转换,而不是将它们全部放在一个大向量中。
最后,我想在数据帧中添加每个向量(来自每个单个 S4 对象)。
... | 对象 |
---|---|
... | 58 0a 00 00 00 03 00 04 00 03 |
... | 00 04 00 03 00 03 05 00 00 00 |
... | ... |
希望有人能帮帮我,谢谢!
答案 0 :(得分: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
或在 unlist
之后调用 Map
:
> unlist(Map(f, sth))
[1] 01 02 03 04 05
现在我们有了可以作为列添加到 data.frame
的向量,如下所示。
或者,我们可以使用带有一些变量 for
的 i
循环,但是我们需要一些累加器 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)