根据R中另一个data.frame的text.values创建一个关联data.frame?

时间:2018-03-27 13:28:01

标签: r

背景:我有一个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

先谢谢你们。

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