0

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

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

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

4

1 回答 1

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[yok]会给你这个错误,因为“y”的键设置为“SID”。

简而言之,您被要求为 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])

并继续按“输入”以了解我的意思。

于 2013-06-04T16:02:57.240 回答