代码之家  ›  专栏  ›  技术社区  ›  PrincessJellyfish

共享名称的列之间的相关性

  •  0
  • PrincessJellyfish  · 技术社区  · 7 年前

    Site Site1 Site1 Site1 Site1 Site2 Site2
    Name  A     B      C     D    E      F
    Code A12    A41   A32   A33   A21    A12 
    
    -    3.2    4.2   5.2    3.1   1.11   2.52
    -    9.2    0.21  3.12   3.03  2.12   5.12
    ....
    

    所以我试图做的是在“代码”行中找到所有具有相同值的值,要么将它们提取到一个单独的数据帧中,然后计算相关性,要么就在那里计算它们之间的相关性。

    最后我想要的是:

    SiteA  SiteB  Correlation NameA NameB
    Site1  Site2    .87        A12   A12
    Site4  Site8    .76        B32   B32
    

    我之前不知道我会有多少个网站,但我只在代码相同的情况下才会在相关性中插入。

    我试图在一个单独的数据框中提取信息(前3行),并试图将每个站点放在自己的数据框中,但未能做到这一点。

    1 回复  |  直到 7 年前
        1
  •  1
  •   rr_silva    7 年前

    首先,您需要“旋转”数据帧。。。

    DF$Code <- as.factor(DF$Code)
    

    您将获得与不同代码数量相同的级别(希望不要太多)。然后只需选择代码相同的行,如:

    DF[which(DF$Code=="A12"),] 
    DF[which(DF$Code=="B32") ,]
    

    因为你有数百种不同的代码,你必须对你的脚本做进一步的修改。。。

    table(DF$Code)
    

    Dx <- as.data.frame(table(DF$Code))
    Repeated_codes <- Dx$Var1[which(Dx$Freq)>1]
    

    我假设每个代码在原始数据中只出现一次或两次。

    创建一个空数据帧来“放置”循环的结果:

    final_df <- data.frame(Site_X=character(),
    Site_Y=character(),
    Correlation=integer(),
    Name_X=character(),
    Name_Y=character(),
    stringsAsFactors=FALSE)
    

    然后,您可以使用:

    for (i in c(1:length(Repeated_codes))){
    Code_x <- Repeated_codes[i]
    DFi <- DF[which(DF$Code == Code_x),]
    cor_i <- cor(DFi$X1, DFi$X2) 
    final_df[i,"Site_X"] <- DFi[1,"Site"]
    final_df[i,"Site_Y"] <- DFi[2,"Site"]
    final_df[i,"Correlation"] <- round(as.numeric(cor_i$estimate)
    final_df[i,"Name_X"] <- DFi[1,"Code"]
    final_df[i,"Name_Y"] <- DFi[2,"Code"]
    }