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

时间:2017-09-21 11:55:56

标签: r correlation

我有一个大数据框,其中包含数据来自哪个站点的信息,名称,代码,然后是空行,然后是数据。

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 个答案:

答案 0 :(得分:1)

首先你需要"旋转"你的数据框...... 例如,您可以使用transpose()或reshape()并调用新的数据帧DF。

如果数据框DF的列名为" Site"," Name"," Code"," X1",&# 34; X2" (等),你可以使用:

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

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

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

因为您有数百个不同的代码,所以您必须更进一步使用您的脚本... 您可以使用以下命令检查每个代码在数据框中出现的次数:

table(DF$Code)

使用以下内容获取带有+ - 100重复代码的向量:

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

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

创建一个空的数据框到&#34; put&#34;循环的结果:

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"]
}

它会&#34;导入&#34;从DF到final_df的数据,并给出相关系数。