以长格式对data.table进行t.test

时间:2013-06-04 15:20:20

标签: r data.table

我在data.table收到错误,我不明白。我想要做的是执行多个t.test作为事后分析。所以这里有一些示例数据:

dt <- data.table(
  expand.grid( list( SID = rep( paste0( "x", 1:3), 3 ), MID = paste0( "y", 1:5) ), stringsAsFactors=FALSE ),
  A = rnorm(45),
  key = c("SID")
)    dt

   SID MID          A
1:  x1  y1 -1.4451214
2:  x1  y2 -0.6141025
3:  x1  y3 -1.0388595
4:  x1  y4 -0.8098261
...

这给了我一个奇怪的错误:

dt[ , list( t.test( x=.SD[ J("x1"), A ], y=.SD[ J("x2"), A ] )$p.value ) , by = MID ]
Error in setkey(ans, NULL) : 
  x may no longer be the character name of the data.table. The possibility was undocumented and has been removed.

我不知道这意味着什么,但所需的输出就像是

   MID p.x1.x2
1: y1  0.1
2: y2  0.2
3: y3  0.3
4: y4  0.4
5: y5  0.5

这就是我最终能够做到的事情(只是为了给你全面了解):

combinations <- lapply( as.data.frame( combn( unique(dt$SID), 2 ), stringsAsFactors=FALSE ), identity )
combinations
$V1
[1] "x1" "x2"

$V2
[1] "x1" "x3"

$V3
[1] "x2" "x3"    

test.tab <- lapply( combinations, function( .sid, .dt ){
  dt[ , list( t.test( x=.SD[ J(.sid[1]), A ], y=.SD[ J(.sid[2]), A ] )$p.value ) , by = MID ]
}, .dt = dt )
test.tab <- as.data.table( as.data.frame( test.tab ) )

任何想法如何避免错误是值得赞赏的。获得相同结果的任何其他方法都可以。

1 个答案:

答案 0 :(得分:1)

错误来自t.test.default中的这一行:

y <- y[yok]

Error in setkey(ans, NULL) : 
  x may no longer be the character name of the data.table. The possibility was undocumented and has been removed.

您可以使用stats:::t.test.default在屏幕上打印该功能(这是针对您的t.test版本运行的。)

在这里,y应该是一个向量,当你提供.SD[J("x1"), A] data.table时(正如我在评论中提到的那样)。

在您的情况下,yok评估为:

       SID    A
 [1,] TRUE TRUE
 [2,] TRUE TRUE
 [3,] TRUE TRUE
 [4,] TRUE TRUE
 [5,] TRUE TRUE
 [6,] TRUE TRUE
 [7,] TRUE TRUE
 [8,] TRUE TRUE
 [9,] TRUE TRUE
[10,] TRUE TRUE
[11,] TRUE TRUE
[12,] TRUE TRUE
[13,] TRUE TRUE
[14,] TRUE TRUE
[15,] TRUE TRUE

y是:

    SID           A
 1:  x2 -0.80390040
 2:  x2  0.34483953
 3:  x2  2.08006382
 4:  x2  0.87859745
 5:  x2  1.04123702
 6:  x2  0.13653716
 7:  x2  0.58482554
 8:  x2 -0.78308074
 9:  x2 -0.02177879
10:  x2 -0.33626948
11:  x2  0.17005957
12:  x2  1.15227502
13:  x2  1.21486699
14:  x2  0.93856469
15:  x2 -0.54720535

当{y}的键设置为“SID”时,执行y[yok]会给你这个错误。

简而言之,你被要求为x和y参数提供一个值向量,而你提供一个data.table,因为它用“SID”列键入,它在内部运行y[yok]这是两个列,错误发生在那里。如果您执行:as.data.frame(.SD[J("x1"), A]),那么您会看到此错误将消失,但您仍会收到其他错误(此错误消失,因为没有“关键”问题)。

这样做:

debugonce(stats:::t.test.default)
t.test(dt["x1", A], dt["x2", A])

并继续点击“输入”以查看我的意思。