'x' должен быть числовым вектором: ошибка в data.frame of numbers - PullRequest
1 голос
/ 04 октября 2011

Я запускаю cor.test по двум столбцам в файле / таблице.

tmp <- read.table(files_to_test[i], header=TRUE, sep="\t")
## Obtain Columns To Compare ##
colA <-tmp[compareA]
colB <-tmp[compareB]
# sctr = 'spearman cor.test result'
sctr <- cor.test(colA, colB, alternative="two.sided", method="spearman")

Но я получаю эту запутанную ошибку ...

Error in cor.test.default(colA, colB, alternative = "two.sided", method = "spearman") : 
'x' must be a numeric vector

значения в столбцах являются числами, но

is.numeric(colA) = FALSE 
class (colA) = data.frame

Что я пропустил?

Ответы [ 2 ]

9 голосов
/ 04 октября 2011

Поставьте запятую перед вашим селектором.Когда вы выбираете в объекте data.frame одну переменную индексации без запятой, он извлекает столбец как тип сохранения элемента списка.Следовательно, это все еще датафрейм.Но объекты data.frame позволяют вам выбирать, используя нотацию в стиле матрицы, и тогда вы получите простой вектор.Так что просто измените

colA <-tmp[compareA]
colB <-tmp[compareB]

на

colA <-tmp[,compareA]
colB <-tmp[,compareB]

Я думаю, что это больше соответствует духу типа data.frame, чем двойные скобки ([[), которые будут делатьнечто подобное, но в духе основного типа списка.Они также не связаны с отдельными селекторами элементов и строк.Итак, в коде, который делает разные вещи с data.frame, двойные скобки выделяются как странная утка.

4 голосов
/ 04 октября 2011

Попробуйте tmp[[compareA]] и tmp[[compareB]] вместо одинарных скобок.Вы хотели извлечь числовые векторы, вместо этого вы извлекли фреймы данных из одного столбца.Сравните следующее:

> z <- data.frame(a=1:5,b=1:5)
> str(z["a"])
'data.frame':   5 obs. of  1 variable:
 $ a: int  1 2 3 4 5
> is.numeric(z["a"])
[1] FALSE
> str(z[["a"]])
 int [1:5] 1 2 3 4 5
> is.numeric(z[["a"]])
[1] TRUE

Попробуйте это с cor.test:

Одинарные скобки: ошибка, как указано выше.

> cor.test(z["a"],z["b"])
Error in cor.test.default(z["a"], z["b"]) : 'x' must be a numeric vector

Двойные скобки: работает.

> cor.test(z[["a"]],z[["b"]])

    Pearson's product-moment correlation

data:  z[["a"]] and z[["b"]] 
[snip snip snip]

Как @Aaron указывает ниже, cor будет хорошо обрабатывать кадры данных с одним столбцом, преобразовывая их в матрицы - но cor.test этого не делает.(Это может быть поднято на r-devel@r-project.org или передано в систему отслеживания ошибок R как элемент списка желаний ...)

См. Также: Числовой столбец в data.frame, возвращающий "num"с str (), но не is.numeric () , Какая самая большая R-гоча, с которой вы столкнулись? (может быть, другие)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...