0

我有一个 data.frame,我想使用一列与其他列计算相关系数(框架中也有一些非数字列)。

ddply(Banks,.(brand_id,standard.quarter),function(x) { cor(BLY11,x) })
# Error in cor(BLY11, x) : 'y' must be numeric

我针对 is.numeric(x) 进行了测试

ddply(Banks,.(brand_id,standard.quarter),function(x) { if is.numeric(x) cor(BLY11,x) else 0 })

但是每次比较都失败并返回 0 并且只返回一列,就好像它只被调用一次一样。传递给函数的是什么?刚来到 R,我认为我缺少一些基本的东西。

谢谢

4

5 回答 5

5

来自?cor:

如果“x”和“y”是矩阵,则计算“x”列和“y”列之间的协方差(或相关性)。

所以你唯一真正的工作是删除非数字列:

# An example data.frame containing a non-numeric column
d <- cbind(fac=c("A","B"), mtcars)

## Calculate correlations between the mpg column and all numeric columns
cor(d$mpg, as.matrix(d[sapply(d, is.numeric)]))
     mpg       cyl       disp         hp      drat         wt     qsec
[1,]   1 -0.852162 -0.8475514 -0.7761684 0.6811719 -0.8676594 0.418684
            vs        am      gear       carb
[1,] 0.6640389 0.5998324 0.4802848 -0.5509251

编辑:事实上,正如@MYaseen208 的回答所示,没有必要将 data.frames 显式转换为矩阵。以下两项工作都很好:

cor(d$mpg, d[sapply(d, is.numeric)])

cor(mtcars, mtcars)
于 2012-08-29T16:59:50.493 回答
5

试试这样的

cor(longley[, 1], longley[ , sapply(longley, is.numeric)])



    GNP.deflator       GNP Unemployed Armed.Forces Population      Year  Employed
[1,]            1 0.9915892  0.6206334    0.4647442  0.9791634 0.9911492 0.9708985
于 2012-08-29T17:02:52.037 回答
2

此函数对块进行操作:

calc_cor_only_numeric = function(chunk) {
   is_numeric = sapply(chunk, is.numeric)
   return(cor(chunk[-is_numeric]))
 }

并且可以用于ddply

ddply(banks, .(cat1, cat2), calc_cor_only_numeric)

我无法检查代码,但这应该可以帮助您入门。

于 2012-08-29T16:51:31.890 回答
2

ddply 将 data.frame 拆分为块并将它们(较小的 data.frames)发送到您的函数。你x是一个 data.frame 与相同的列Banks。因此,is.numeric(x)FALSEis.data.frame(x)应该返回TRUE

尝试:

function(x) { 
  cor(x$BLY11, x$othercolumnname) 
}
于 2012-08-29T16:24:31.040 回答
1

看起来你正在做的事情也可以完成sapply

with(Banks,
  sapply( list(brand_id,standard.quarter), function(x) cor(BLY11,x) )
)
于 2012-08-29T16:37:30.027 回答