我有一个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,我认为我缺少一些基本的东西。
由于
答案 0 :(得分: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)
答案 1 :(得分: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
答案 2 :(得分:2)
ddply将data.frame拆分为块并将它们(较小的data.frames)发送到您的函数。您的x
是一个与Banks
列相同的data.frame。因此,is.numeric(x)
是FALSE
。 is.data.frame(x)
应该返回TRUE
。
尝试:
function(x) {
cor(x$BLY11, x$othercolumnname)
}
答案 3 :(得分:1)
看起来你正在做的事情也可以用sapply
完成:
with(Banks,
sapply( list(brand_id,standard.quarter), function(x) cor(BLY11,x) )
)
答案 4 :(得分:1)
此功能在块上运行:
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)
我无法检查代码,但这应该让你开始。