我想创建一个包含不同变量的 data.frame,包括 S4 类。对于像“POSIXlt”(日期)这样的内置类,这很好用:
as.data.frame(list(id=c(1,2),
date=c(as.POSIXlt('2013-01-01'),as.POSIXlt('2013-01-02'))
但是现在我有一个用户定义的类,让我们说一个带有名称和年龄的“Person”类:
setClass("person", representation(name="character", age="numeric"))
但以下失败:
as.data.frame(list(id=c(1,2), pers=c(new("person", name="John", age=20),
new("person", name="Tom", age=30))))
我还尝试使用 [...]-Operator 为 person 类重载
setMethod(
f = "[",
signature="person",
definition=function(x,i,j,...,drop=TRUE){
initialize(x, name=x@name[i], age = x@age[i])
}
)
这允许类似向量的行为:
persons = new("person", name=c("John","Tom"), age=c(20,30))
p1 = persons[1]
但是以下仍然失败:
as.data.frame(list(id=c(1,2), pers=persons))
也许我必须重载更多运算符才能将用户定义的类放入数据框中?我敢肯定,一定有办法做到这一点,因为 POSIXlt 是一个 S4 类并且它有效!任何使用新 R5 参考类的解决方案也可以!
我不想把我所有的数据都放到 person 类中(你可能会问,为什么“id”不是 person 的成员,我只是不使用数据框)!这个想法是我的 data.frame 代表数据库中的一个表,其中包含许多不同类型的列,例如字符串、数字……还有日期、间隔、地理对象等……而对于我已经拥有的日期一个解决方案(POSIXlt),用于间隔、地理对象等。我可能需要指定我自己的 S4/R5 类。
提前非常感谢。