2013-05-19 64 views
9

有这样的情况。试图将“mtcars”类从data.frame转换为data.table。将data.frame转换为data.table列缺失

“mtcars” 数据:

> mtcars 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4   21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
Mazda RX4 Wag  21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 
Datsun 710   22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 

原班是 “data.frame”。

> str(mtcars) 
'data.frame': 32 obs. of 11 variables: 
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ... 
$ disp: num 160 160 108 258 360 ... 
$ hp : num 110 110 93 110 175 105 245 62 95 123 ... 
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
$ wt : num 2.62 2.88 2.32 3.21 3.44 ... 
$ qsec: num 16.5 17 18.6 19.4 17 ... 
$ vs : num 0 0 1 1 0 1 0 1 1 1 ... 
$ am : num 1 1 1 0 0 0 0 0 0 0 ... 
$ gear: num 4 4 4 3 3 3 3 4 4 4 ... 
$ carb: num 4 4 1 1 2 1 4 2 2 4 ... 

转换为data.table。发现汽车品牌专栏消失了。为什么?如何保留品牌栏目?

> mtcars2 <- data.table(mtcars) 
> mtcars2 
    mpg cyl disp hp drat wt qsec vs am gear carb 
1: 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
2: 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 
3: 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 

想要一个data.table最终的数据格式如下 - 第一列品牌有一个新的专栏名称“Brands”。如何编写从原始“mtcars”数据集中添加“Brands”列?

Brands    mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4   21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
Mazda RX4 Wag  21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 
Datsun 710   22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 

回答

11

这是缺少的rownames,不是其中的一列。

如果你想品牌为一列,手动的方法是:

data.table(Brands = rownames(mtcars), mtcars) 

或者:

data.table(mtcars, keep.rownames = TRUE) 

然而,这并不会使导致data.table已老rownames,它只是为他们设立了一个专栏,名为“rn”。这在文档?data.table中。


或者,修改表的地方,DF = mtcars

setDT(DF, keep.rownames = "Brands") 

小点:我们不能setDT(mtcars, ...),因为mtcars是一个内置的表。

+1

感谢您的指针。 – KFB

+1

如果您想选择另一个名称而不是默认名称“rn”,您也可以编写'data.table(mtcars,keep.rownames =“Brands”)'。 (使用'data.table'的CRAN版本1.10.4)。 – Uwe

+0

@UweBlock在1.10.5上测试,不会创建品牌列。它确实对setDT有效,但是...我正在编辑它。谢谢 – Frank

相关问题