chisq.test错误消息

时间:2011-01-19 20:16:41

标签: r dataframe

这是我遇到的问题:

示例数据

df <- data.frame(1,2,3,4,5,6,7,8)
df <- rbind(df,df,df,df)

我想要做的是在第一行中定义的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.

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

chisq.test(df[1,1:3],df[1,4:6])$p.value

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

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

length(df[1,1:3])
length(df[1,4:6])

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

2 个答案:

答案 0 :(得分: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.

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

> is.numeric(df[1,1:3])
[1] FALSE
> is.vector(df[1,1:3])
[1] FALSE
> is.matrix(df[1,1:3])
[1] FALSE

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

Browse[2]> x ## here x is df[1,1:3]
[1] 1 2 3

df[1,4:6]y函数中的chisq.test)保持不变:

Browse[2]> y
  X4 X5 X6
1  4  5  6

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

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

complete.cases调用内部代码,因此我们看不到发生了什么,但基本上R认为xy的长度不同,这是因为它们属于不同类型。

@Prasad提供了一种解决方法,即将您提供给chisq.test的2个数据框列入向量中。

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

> df2 <- data.frame(t(df))

然后我们可以使用您所做的方法,但索引df2的第一列(而不是df的第一行的单独列)的单独行。{{1}呼叫:

chisq.test

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

> 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

答案 1 :(得分:2)

从数据框中提取行时使用unlist

> chisq.test(unlist(df[1,1:3]),unlist(df[1,4:6]))$p.value
[1] 0.1991483
Warning message:
In chisq.test(unlist(df[1, 1:3]), unlist(df[1, 4:6])) :
  Chi-squared approximation may be incorrect