[英]For data.frame in R, pulling data from one data frame based on values from another data frame
[英]Create a correlation data.frame based on text.values from another data.frame in R?
背景:我有一個text.values從A到F的data.frame,基於此數據,我想通過使用以下公式計算不同公司之間的相關性data.frame(公司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
預先感謝您。
使用基數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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.