chisq.test错误消息

Bra*_*sen 1 r dataframe

这是我遇到的一个问题:

示例数据

df <- data.frame(1,2,3,4,5,6,7,8)
df <- rbind(df,df,df,df)
Run Code Online (Sandbox Code Playgroud)

我想要做的是在第一行中定义的data.frame中找到1,2,3与4,5,6的chisq.test的p.value.

让我们试试吧:

chisq.test(c(1,2,3),c(4,5,6))$p.value ## this works.
Run Code Online (Sandbox Code Playgroud)

但是当我尝试通过调用列/行来实现它时...

chisq.test(df[1,1:3],df[1,4:6])$p.value
Run Code Online (Sandbox Code Playgroud)

给出:complete.cases(x,y)中的错误:并非所有参数都具有相同的长度

有趣,因为这似乎不是真的:

length(df[1,1:3])
length(df[1,4:6])
Run Code Online (Sandbox Code Playgroud)

有关如何更改符号以获得所需结果的任何想法?

Rei*_*son 5

?chisq.test 告诉我们:

Arguments:

       x: a numeric vector or matrix. ‘x’ and ‘y’ can also both be
          factors.

       y: a numeric vector; ignored if ‘x’ is a matrix.  If ‘x’ is a
          factor, ‘y’ should be a factor of the same length.
Run Code Online (Sandbox Code Playgroud)

如果我们df根据您的Q 查看,您定义的子集是:

> is.numeric(df[1,1:3])
[1] FALSE
> is.vector(df[1,1:3])
[1] FALSE
> is.matrix(df[1,1:3])
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

和你的其他子集相同.那么接下来发生在上帝的一圈.内部发生的是,作为df[1,1:3]数据帧,它首先被转换为一个列矩阵,然后转换为向量:

Browse[2]> x ## here x is df[1,1:3]
[1] 1 2 3
Run Code Online (Sandbox Code Playgroud)

虽然df[1,4:6](ychisq.test功能中)保持不变:

Browse[2]> y
  X4 X5 X6
1  4  5  6
Run Code Online (Sandbox Code Playgroud)

当代码调用时complete.cases(x,y),我们会收到您报告的错误:

Browse[2]> complete.cases(x, y)
Error in complete.cases(x, y) : not all arguments have the same length
Run Code Online (Sandbox Code Playgroud)

complete.cases调用内部代码,所以我们无法看到发生了什么,但本质上R认为x并且y长度不同,这是因为它们的类型不同.

@Prasad提供了一种解决方法,即将您提供的2个数据帧展开chisq.test到向量中.

但是,至少对我来说,使用该功能的方式没有多大意义.通常会将数据存储在列中,而不是数据帧的行中.它可能看起来没有区别,但数据框的列是其组件,如列表的组件.每个单独的组件(列)是离散实体,数据帧中/ n /观察的数据向量.如果我们将您的转换df(并转换回数据框)以反映更自然的数据设置:

> df2 <- data.frame(t(df))
Run Code Online (Sandbox Code Playgroud)

那么我们就可以用你做的方法,但指数的第一列的单独行df2(而不是第一排的单独的列df)的chisq.test电话:

> chisq.test(df2[1:3,1], df2[4:6,1])

    Pearson's Chi-squared test

data:  df2[1:3, 1] and df2[4:6, 1] 
X-squared = 6, df = 4, p-value = 0.1991

Warning message:
In chisq.test(df2[1:3, 1], df2[4:6, 1]) :
  Chi-squared approximation may be incorrect
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为R能够在两个子集中删除空维度,因此两个输入都是适当长度的向量:

> df2[1:3,1] ## drops the empty dimension!
[1] 1 2 3
> is.vector(df2[1:3,1])
[1] TRUE
Run Code Online (Sandbox Code Playgroud)