背景:我有一个data.frame,其text.values范围从A到F,根据这些数据我想通过使用这个公式来计算不同公司之间的相关数据。 (公司Aa& Cc之间的例子):
计算Aa&的次数Cc一起移动,这里3次并除以周期数,这里是4.然后创建一个具有不同相关性的data.frame。我不知道如何开始这一点......一些见解会非常感激。
我在data.frame" databasis"
中有以下值 company sector lastmarketcap X200202 X200203 X200204 X200205
1 Aa B 18 A D E B
2 Bb A 4571 F C D B
3 Cc E 122 A D E E
4 Dd Z 239 B C E C
此表的代码:
company <- c("Aa", "Bb", "Cc", "Dd")
sector <- c("B", "A", "E", "Z")
lastmarketcap <- c(18, 4571, 122, 239)
X200202 <- c("A", "D", "E", "B")
X200203 <- c("F", "C", "D", "B")
X200204 <- c("A", "D", "E", "E")
X200205 <- c("B", "C", "E", "C")
databasis <- data.frame(company, sector, lastmarketcap, X200202, X200203, X200204, X200205)
输出
lastmarketcap company Aa Bb Cc Dd
1 18 Aa 1 0.25 0.75 0.25
2 4571 Bb 0.25 1 0 0.25
3 122 Cc 0.75 0 1 0.25
4 239 Dd 0.25 0.25 0.25 1
先谢谢你们。
答案 0 :(得分:1)
使用基数R:
dat=as.data.frame(t(subset(databasis,select = -(2:3))),stringsAsFactors = F)
m= combn(dat,2,function(x)sum(Reduce("==",x)))/4
mat=diag(4)
mat[lower.tri(mat)]=m
mat[upper.tri(mat)]=t(mat)[upper.tri(mat)]
mat
[,1] [,2] [,3] [,4]
[1,] 1.00 0.25 0.75 0.25
[2,] 0.25 1.00 0.00 0.25
[3,] 0.75 0.00 1.00 0.25
[4,] 0.25 0.25 0.25 1.00
数据:
databasis=read.table(text=" company sector lastmarketcap X200202 X200203 X200204 X200205
1 Aa B 18 A D E B
2 Bb A 4571 F C D B
3 Cc E 122 A D E E
4 Dd Z 239 B C E C")
你也可以这样做:
dat=as.data.frame(t(subset(databasis,select = -(2:3))),stringsAsFactors = F)
m= combn(dat,2,function(x)sum(x[[1]]==x[[2]])/4)
n=combn(company,2,paste,collapse=" ")
n1=sub("(\\w+)\\s(\\w+)","\\2 \\1",n)
prob=xtabs(V3~V1+V2,read.table(text=c(paste(n,m),paste(n1,m),
paste(company,company,1))))
cbind(databasis[1:2],as.data.frame.matrix(prob))
company sector Aa Bb Cc Dd
1 Aa B 1.00 0.25 0.75 0.25
2 Bb A 0.25 1.00 0.00 0.25
3 Cc E 0.75 0.00 1.00 0.25
4 Dd Z 0.25 0.25 0.25 1.00