'x'必须是数字向量:来自data.frame数字的错误

时间:2011-10-04 18:07:39

标签: r dataframe

我在文件/表中的两列上运行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 个答案:

答案 0 :(得分:9)

在选择器前放一个逗号。当您使用单个索引变量而不使用逗号选择data.frame对象时,它会将列提取为列表元素保留类型。因此,它仍然是一个data.frame。但是,data.frame对象允许您使用矩阵样式表示法进行选择,然后您将获得一个简单的向量。所以只需改变

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

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

我认为这更符合data.frame类型的精神,而不是双括号([[)选择器,它们会做类似但基于列表类型的精神。它们也与单个项目和行选择器无关。因此,在使用data.frame执行多种操作的代码中,双括号选择器显得有些奇怪。

答案 1 :(得分:4)

尝试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 bug跟踪器......)

另请参阅:Numeric Column in data.frame returning "num" with str() but not is.numeric()What's the biggest R-gotcha you've run across?(可能是其他人)