?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.
Если мы посмотрим на 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
и то же самое для вашегодругое подмножество.То, что происходит тогда, находится на коленях Бога.Внутри происходит то, что, поскольку df[1,1:3]
является фреймом данных, он сначала преобразуется в матрицу из одного столбца, а затем в вектор:
Browse[2]> x ## here x is df[1,1:3]
[1] 1 2 3
, а df[1,4:6]
(y
в *Функция 1015 *) остается нетронутой:
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
, в векторы.
Однако то, как вы используете функцию, не имеет особого смысла, по крайней мере для меня.Обычно можно хранить данные в столбцах, а не в строках фрейма данных.Может показаться, что разница не существует, но столбцы фрейма данных являются его компонентами, например компонентами списка.Каждый отдельный компонент (столбец) представляет собой отдельный объект, вектор данных о / n / наблюдениях в кадре данных.Если мы транспонируем ваш df
(и приводим обратно к фрейму данных), чтобы отразить более естественную настройку данных:
> df2 <- data.frame(t(df))
, тогда мы можем использовать подход, который вы использовали, но индексировать отдельные строкипервый столбец 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
Это работает, потому что R может отбрасывать пустое измерениев обоих подмножествах, поэтому оба входа являются векторами соответствующей длины:
> df2[1:3,1] ## drops the empty dimension!
[1] 1 2 3
> is.vector(df2[1:3,1])
[1] TRUE