colnames()似乎按预期枚举每个组的所有列,但class()每组显示两行!其中一个是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 :(得分:2)
.SD
代表Data.table的Subset列,因此它也是一个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
答案 1 :(得分:0)
每个data.table都是一个data.frame,并在询问时显示两个适用的类:
> class(dt)
[1] "data.table" "data.frame"
这也适用于.SD
,因为.SD是一个数据表,根据定义(.SD是一个data.table包含 S ubset的x D 强>每组的ata)