可能有一个简单的解决方案,我错过了,但我不知道在哪里找到这个答案,如果它存在。我开始使用data.table
类,但也希望能够编写与data.frame
对象和data.table
对象兼容并返回的函数。
现在,我知道data.table使用UseMethod
函数将函数的参数设置为data.frame,如果该函数是用于data.frames的话。我想我的问题是,如何指定这个并在自定义函数中具有这种灵活性?
以下是使用arrange
函数的示例:
> require(plyr)
>
> df <- data.frame(a = 1:5, b = 1:5)
> df <- arrange(df, a)
> class(df)
[1] "data.frame"
>
> dt <- data.table(a = 1:5, b = 1:5)
> dt <- arrange(dt, a)
> class(dt)
[1] "data.table" "data.frame"
每次调用arrange
时都会保留数据集的类。使用UseMethod
,我可以在自定义函数的第一个参数上调用UseMethod("as.data.frame")
并确实转换它,但是,我不确定该方法的用途是什么设置相同的对象以在返回时转换回其原始类。
我可以使用if语句手动执行此操作,即:
if (class(data)[1] == "data.table")) { data <- as.data.table(data) } else { data <- as.data.frame(data) }
但这种感觉太难编码了,我觉得有一种更为先进的方法,我不知道。
本质上,我想创建一个自定义函数,它接受data.frame或data.table对象,将该对象转换为data.frame,执行基于data.frame的操作,并在任何类中返回该对象最初是在。
这可能是一个愚蠢的问题,但任何见解都会非常感激!
编辑:
添加合并示例,因为arrange
是一个选择不当的示例:
> require(data.table)
>
> dt1 <- data.table(a = 1:5)
> class(dt1)
[1] "data.table" "data.frame"
> dt2 <- data.table(b = 1:5)
> class(dt2)
[1] "data.table" "data.frame"
>
> m <- merge.data.frame(dt1, dt2)
> class(m)
[1] "data.frame"
merge.data.frame
如何知道将data.table对象转换为data.frame?为什么这不会引发错误?