我有一个大数据框,其中包含数据来自哪个站点的信息,名称,代码,然后是空行,然后是数据。
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行)并试图将每个网站放在自己的数据框中,但是无法这样做。
答案 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的数据,并给出相关系数。