使用data.table

时间:2015-06-30 18:14:55

标签: r data.table

我有以下示例数据(d1和d2),我正在尝试通过变量carb计算mahalanobis.distance,然后追加到d1。

library(data.table)
library(StatMatch) #mahalanobis.distance

df<-as.data.table(mtcars)[carb %in% c(2,4), .(mpg, carb, vs)] # two groups of carb
d1<-df[vs==0,.(mpg,carb)]
d2<-df[vs==1,.(mpg,carb)]

#for carb==2, 

md2<-mahalanobis.dist(d1[carb==2,mpg],d2[carb==2,mpg])

             1        2        3         4         5
1 1.0416378 1.626417 1.681240 0.9502661 0.2923896
2 0.7492482 1.334027 1.388850 0.6578765 0.5847791
3 2.1380986 2.722878 2.777701 2.0467269 0.8040713
4 2.1380986 2.722878 2.777701 2.0467269 0.8040713
5 0.4934074 1.078186 1.133010 0.4020356 0.8406200

矩阵md2的维数:row是df1的行,列是df2的行。

#for carb==4

 md4<-mahalanobis.dist(d1[carb==4,mpg],d2[carb==4,mpg])
              1         2
    1 0.4602308 0.8181881
    2 0.4602308 0.8181881
    3 1.2528505 0.8948932
    4 2.2500173 1.8920600
    5 2.2500173 1.8920600
    6 1.1505770 0.7926197
    7 1.5085343 1.1505770
    8 0.8693248 0.5113676

我想知道是否有可能使用data.table by carb计算它,然后追加到d1。我的方法没有给出正确答案,如下所示

d1[,mahalanobis.dist(d1[,mpg,by=carb],d2[,mpg,by=carb]),by=carb]

     carb        V1
  1:    2 0.5925119
  2:    2 0.3136828
  3:    2 0.3136828
  4:    2 0.5576583
  5:    2 1.6381213
 ---               
178:    4 0.5925119
179:    4 0.3485364
180:    4 2.5443160
181:    4 2.5443160
182:    4 0.9759020

1 个答案:

答案 0 :(得分:2)

您不需要单独的数据集。只需按原始数据集中的条件计算距离

df[, mahalanobis.dist(mpg[vs == 0], mpg[vs == 1]), keyby = carb]
#    carb        V1
# 1:    2 1.0416378
# 2:    2 1.6264169
# 3:    2 1.6812399
# 4:    2 0.9502661
# 5:    2 0.2923896
# 6:    2 0.7492482
# 7:    2 1.3340273
# 8:    2 1.3888504
# 9:    2 0.6578765
# ...

实际上,您可以直接在mtcars上运行此操作,而无需创建任何新数据集,例如

as.data.table(mtcars)[carb %in% c(2, 4), 
                      mahalanobis.dist(mpg[vs == 0], mpg[vs == 1]), 
                      keyby = carb]