2

CrossValidated 上有一个问题,有人给t.test函数提供了两个数据帧而不是两个向量:https ://stats.stackexchange.com/questions/261830/t-test-or-wilcox-in-r-and-how-应用到数据框拆分成 2 组/

请参阅此代码以获取更短的示例

a <- data.frame(foo=1:5, bar=5:9)
b <- data.frame(foo=1:5, bar=5:9)
t.test(a,b)

该函数的help页面t.test明确指出 x 和 y 应该是

数据值的(非空)数字向量。

上面的代码仍然没有抛出错误,但给出了结果。结果的意义是什么?

4

2 回答 2

3

你可以看看里面的代码:

 stats:::t.test.default

我在这里展示了一些选定的代码片段

function (x, y = NULL, alternative = c("two.sided", "less", "greater"), 
    mu = 0, paired = FALSE, var.equal = FALSE, conf.level = 0.95, 
    ...) 
{
    alternative <- match.arg(alternative)
    if (!missing(mu) && (length(mu) != 1 || is.na(mu))) 
    ### snip
    if (!is.null(y)) {
    ### snip
       yok <- !is.na(y)
       xok <- !is.na(x)
    ### snip
      y <- y[yok]

所以我们确实有一个参数,你会看到这yok将导致一个选择,当在y[yok]. 最后,一切都将发生在 data.frame 上,强制转换为向量 ( as.vector)。

绝对不是一个人打算做的事情,而是用户的错误规格......

于 2017-02-14T11:57:26.113 回答
2

这是未记录的行为,但是您在传递 data.frames 时违反了文档。

有时候是这样的:

x <- a
y <- b
yok <- !is.na(y)
xok <- !is.na(x)
y <- y[yok]
#[1] 1 2 3 4 5 5 6 7 8 9
x <- x[yok]
#[1] 1 2 3 4 5 5 6 7 8 9

基本上,你得到的结果和你做的一样t.test(unlist(a), unlist(b))

于 2017-02-14T11:56:47.287 回答