为什么data.table上的类(.SD)显示“data.frame”?

时间:2016-05-23 12:50:53

标签: r dataframe data.table

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

2 个答案:

答案 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)