这是我遇到的问题:
示例数据
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])
有关如何更改符号以获得所需结果的任何想法?
答案 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认为x
和y
的长度不同,这是因为它们属于不同类型。
@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