我在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 ) )
任何想法如何避免错误是值得赞赏的。获得相同结果的任何其他方法都可以。
答案 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])
并继续点击“输入”以查看我的意思。