2011-10-04 121 views
1

我在文件/表格的两列上运行cor.test。'x'必须是数字向量:来自data.frame的数字错误

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

'str(colA)'和'str(colB)'的结果是什么。我猜这些数据是作为因素或字符数据读取的,可能是因为您读取的数据中存在错误的字符。 – Chase

+0

@Chase:我upvoted你的评论,但后来意识到这不是问题(见下面的答案)。事后看来,我认为这有点误导,但是我无法删除我的赞... –

+0

@Ben and @Chase:给出'str'结果的建议虽然不错。 (我给了第二个upvote)。 – Aaron

回答

9

前加上一个逗号您选择。当您使用单个索引变量而不使用逗号的data.frame对象中进行选择时,它将提取列作为列表元素保留类型。因此,它仍然是一个data.frame。但是,data.frame对象允许您选择使用矩阵样式符号,然后您将得到一个简单的向量。因此,只要改变

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

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

我觉得这是更保持与data.frame类型比双括号([[)选择的精神,这将做同样的事情,但在精神的基础列表类型。它们也与单个项目和行选择器无关。因此,在使用data.frame处理多种事物的代码中,双括号选择器显得有点奇怪。

+0

这工作以及我的解决方案上面。我不知道是否有角落的情况下,他们的行为有所不同... –

+0

这对我来说,简单和容易。 – oaxacamatt

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没有。 (这可能是在那儿长大的[email protected]ject.org,或??提交到R bug跟踪系统为AA愿望清单项...)

参见:Numeric Column in data.frame returning "num" with str() but not is.numeric()What's the biggest R-gotcha you've run across?(其它)

+0

虽然这确实使代码更清晰,但'cor'会将数据帧转换为矩阵,所以这应该与OP的代码具有相同的结果。 – Aaron

+0

我没有仔细阅读; OP正在使用'cor.test',它不会执行此转换。我怀疑你是对的。 – Aaron

+0

很好的解释,谢谢 – oaxacamatt

相关问题