我在文件/表中的两列上运行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
我错过了什么?
答案 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?(可能是其他人)