2016-05-23 23 views
1

colnames()似乎按预期枚举每个组的所有列,但class()每个组只显示两行!其中一人是data.frame为什么data.table上的类(.SD)显示“data.frame”?

> dt <- data.table("a"=1:3, "b"=1:3, "c"=1:3, "d"=1:3, "e"=1:3) 

> dt[, class(.SD), by=a] 
    x y z   V1 
1: 1 1 1 data.table 
2: 1 1 1 data.frame 
3: 2 2 2 data.table 
4: 2 2 2 data.frame 
5: 3 3 3 data.table 
6: 3 3 3 data.frame 


> dt[, colnames(.SD), by=x] 
    x y z V1 
1: 1 1 1 a 
2: 1 1 1 b 
3: 1 1 1 c 
4: 1 1 1 d 
5: 1 1 1 e 
6: 2 2 2 a 
7: 2 2 2 b 
8: 2 2 2 c 
9: 2 2 2 d 
10: 2 2 2 e 
11: 3 3 3 a 
12: 3 3 3 b 
13: 3 3 3 c 
14: 3 3 3 d 
15: 3 3 3 e 
+0

码是不可再现:'data.table( “A”= 1:3中, “b”= 1:3, “C”= 1:3, “d”= 1: 3,“e”= 1:3)[,class(.SD),by = x]' – jangorecki

+0

道歉,应该是= a。现在修复它。 – vijucat

回答

0

每data.table是一个data.frame,并同时显示适用的类时问:

> class(dt) 
[1] "data.table" "data.frame" 

这适用于.SD,也因为.SD是通过定义的数据表(.SD是包含用于每个组的小号 ubset X的d ATA的data.table)为data.table的列子集

2

.SD看台,因此它也是一个data.table对象。并且因为data.table是一个data.frame class(.SD)会为每个组返回一个长度为2个字符的向量,所以如果您希望为每个组指定单行,会有点混淆。
为了避免这种混淆,您可以将结果包装到另一个列表中,为每个组强制执行一行。

library(data.table) 
dt <- data.table(x=1:3, y=1:3) 
dt[, .(class = list(class(.SD))), by = x] 
# x     class 
#1: 1 data.table,data.frame 
#2: 2 data.table,data.frame 
#3: 3 data.table,data.frame 
相关问题