我尝试将自己的类附加到numeric
,以更改输出format
。这样可以正常工作,但在我执行组by
后,该类将恢复为数字。
实施例: 为我的班级定义一个新的格式函数:
format.myclass <- function(x, ...){
paste("!!", x, "!!", sep = "")
}
然后创建一个小data.table
并将其中一列更改为myclass:
> DT <- data.table(L = rep(letters[1:3],3), N = 1:9)
> setattr(DT$N, "class", "myclass")
> DT
L N
1: a !!1!!
2: b !!2!!
3: c !!3!!
4: a !!4!!
5: b !!5!!
6: c !!6!!
7: a !!7!!
8: b !!8!!
9: c !!9!!
现在执行一个分组,N列恢复为整数:
> DT[, .SD, by = L]
L N
1: a 1
2: a 4
3: a 7
4: b 2
5: b 5
6: b 8
7: c 3
8: c 6
9: c 9
> DT[, sapply(.SD, class), by = L]
L V1
1: a integer
2: b integer
3: c integer
知道为什么吗?
答案 0 :(得分:8)
因为只要R子集一个向量,它就会抛弃该类。为什么?好吧,因为它是一个屁股,这就是原因。你需要写一个“[” - 子集方法。
> DT[,N]
[1] 1 2 3 4 5 6 7 8 9
attr(,"class")
[1] "myclass"
> DT[1:2,N]
[1] 1 2
看看该向量的子集如何删除了该类?那就是问题所在。 data.table正在向你的向量执行此操作。写一个“[”方法(只复制Date使用的方法):
"[.myclass"= function (x, ..., drop = TRUE){
cl <- oldClass(x)
class(x) <- NULL
val <- NextMethod("[")
class(val) <- cl
val
}
> DT[1:2,N]
[1] 1 2
attr(,"class")
[1] "myclass"
现在它有一些课程。这也解决了你的最后一行与sapply:
> DT[, sapply(.SD, class), by = L]
L V1
1: a myclass
2: b myclass
答案 1 :(得分:3)
现在已在v1.8.11, commit 1005+中修复此问题。来自NEWS:
o
.SD
不保留列的类现在已修复。感谢Corone在SO上报道: Why does data.table lose class definition in .SD after group by?