我正在尝试使用corr()函数来计算加权思考。它的工作方式是第一个参数应该是一个矩阵,其中两列对应于我们希望计算其相关性的两个变量,第二个参数应用于每对观察值。
这是一个例子。
> head(d)
Shade_tolerance htot
1 4.56 25.0
2 2.73 23.5
3 2.73 21.5
4 3.97 17.0
5 4.00 25.5
6 4.00 23.5
> head(poids)
[1] 5.200440e-07 5.200440e-07 1.445016e-06 1.445016e-06 1.445016e-06 1.445016e-06
> corr(d,poids)
[1] 0.1357279
所以我得到了它,我可以在我的矩阵上使用它,但我想根据因子的水平计算不同的相关性。假设我正在使用tapply()函数。
> head(d2)
Shade_tolerance htot idp
1 4.56 25.0 19
2 2.73 23.5 19
3 2.73 21.5 19
4 3.97 17.0 18
5 4.00 25.5 18
6 4.00 23.5 18
所以我的梦想是做这样的事情:
tapply(as.matrix(d2[,c(1,2)]), d2$idp, corr)
除了你在tapply()中所知道的,第一个元素需要是avector而不是矩阵。
有人会为我找到任何解决方案吗?
非常感谢你的帮助。
编辑:我刚刚意识到我错过了我向你展示的数据框中加权相关的权重。 因此,如果根据因子的水平采用矩阵和权重,将会有一些。> head(df)
Shade_tolerance htot idp poids
1 4.56 25.0 19 5.200440e-07
2 2.73 23.5 19 5.200440e-07
3 2.73 21.5 19 1.445016e-06
4 3.97 17.0 19 1.445016e-06
5 4.00 25.5 19 1.445016e-06
6 4.00 23.5 19 1.445016e-06
我希望很清楚。
答案 0 :(得分:2)
如果你有一个“巨大的”data.frame,那么使用data.table
可能有所帮助:
require(data.table)
dt <- as.data.table(df)
setkey(dt, "idp")
dt[, list(corr = corr(cbind(Shade_tolerance, htot), poids)), by=idp]
# idp corr
# 1: 18 0.9743547
# 2: 19 0.8387363
答案 1 :(得分:1)
以下是使用库ddply()
中的函数plyr
的解决方案。
ddply(df,.(idp),
summarise,kor=corr(cbind(Shade_tolerance, htot),poids))
idp kor
1 18 0.9743547
2 19 0.8387363
答案 2 :(得分:0)
使用by
和cbind
,
library(boot)
by(dat,dat$idp,FUN=function(x)corr(cbind(x$Shade_tolerance,x$htot),x$poids))
dat$idp: 18
[1] 0.9743547
---------------------------------------------------------------------------------------
dat$idp: 19
[1] 0.7474093