R:用于数据帧列表上的循环,以输出因子级别的每个组合之间的匹配矩阵
我有这样一个数据帧:R:用于数据帧列表上的循环,以输出因子级别的每个组合之间的匹配矩阵,r,matrix,R,Matrix,我有这样一个数据帧: region plot species 1 1A A_B 1 1B B_C 1 1C A_B 1 1D C_D 2 2A B_C 2 2A E_F 2 2B B_C 2 2B E_F 2 2
region plot species
1 1A A_B
1 1B B_C
1 1C A_B
1 1D C_D
2 2A B_C
2 2A E_F
2 2B B_C
2 2B E_F
2 2C E_F
2 2D B_C
3 3A A_B
3 3B A_B
此数据帧可用于数千行,因此我想使用一个循环来:
1) 按区域对数据进行子集划分
2) 然后为所有图的两两比较创建矩阵
在每个子集区域内
在这种情况下,矩阵的i和j维是区域内的绘图ID,矩阵填充包括共享物种组合的计数。矩阵中未填充的一半将填充NAs。这些矩阵将被放入一个列表中。对于本例,结果将是:
resultslist<-
[[1]] 1A 1B 1C 1D
1A NA NA NA NA NA
1B 0 NA NA NA NA
1C 1 0 NA NA NA
1D 0 0 0 NA NA
[[2]] 2A 2B 2C 2D
2A NA NA NA NA NA
2B 2 NA NA NA NA
2C 1 1 NA NA NA
2D 1 1 0 NA NA
[[3]] 3A 3B
3A NA NA
3B 1 NA
resultslist我继续编写您的代码,并得出以下结论:
数据:
data=read.table(text="region plot species
1 1A A_B
1 1B B_C
1 1C A_B
1 1D C_D
2 2A B_C
2 2A E_F
2 2B B_C
2 2B E_F
2 2C E_F
2 2D B_C
3 3A A_B
3 3B A_B",stringsAsFactors=F,h=T)
sublist=NA
for (i in unique(data$region)){
sublist[i]<-list(subset(data, data[,1] == i))
print(i)
}
results = list()
for (r in unique(data$region)){
myset<-split(sublist[[r]][[3]],sublist[[r]][[2]])
output<- matrix(NA, nrow = length(myset), ncol = length(myset))
rownames(output)<-colnames(output)<-unique(sublist[[r]][[2]])
for (j in 1:(length(myset)-1)){
for (i in (j+1):length(myset)){
output[i,j]=sum(myset[[j]] %in% myset[[i]])
}
}
results[[r]]=output
}
[[1]]
1A 1B 1C 1D
1A NA NA NA NA
1B 0 NA NA NA
1C 1 0 NA NA
1D 0 0 0 NA
[[2]]
2A 2B 2C 2D
2A NA NA NA NA
2B 2 NA NA NA
2C 1 1 NA NA
2D 1 1 0 NA
[[3]]
3A 3B
3A NA NA
3B 1 NA
代码:
data=read.table(text="region plot species
1 1A A_B
1 1B B_C
1 1C A_B
1 1D C_D
2 2A B_C
2 2A E_F
2 2B B_C
2 2B E_F
2 2C E_F
2 2D B_C
3 3A A_B
3 3B A_B",stringsAsFactors=F,h=T)
sublist=NA
for (i in unique(data$region)){
sublist[i]<-list(subset(data, data[,1] == i))
print(i)
}
results = list()
for (r in unique(data$region)){
myset<-split(sublist[[r]][[3]],sublist[[r]][[2]])
output<- matrix(NA, nrow = length(myset), ncol = length(myset))
rownames(output)<-colnames(output)<-unique(sublist[[r]][[2]])
for (j in 1:(length(myset)-1)){
for (i in (j+1):length(myset)){
output[i,j]=sum(myset[[j]] %in% myset[[i]])
}
}
results[[r]]=output
}
[[1]]
1A 1B 1C 1D
1A NA NA NA NA
1B 0 NA NA NA
1C 1 0 NA NA
1D 0 0 0 NA
[[2]]
2A 2B 2C 2D
2A NA NA NA NA
2B 2 NA NA NA
2C 1 1 NA NA
2D 1 1 0 NA
[[3]]
3A 3B
3A NA NA
3B 1 NA
非常感谢您抽出时间。当我使用我提供给您的示例数据时,这段代码非常有效。然而,当在实际数据上使用它时,我得到了以下错误:rownamesHm中的错误,如果不看到数据就很难判断。您可以尝试将定义行名的行更改为:rownames(输出)并感谢您的更正,我已经编辑了行号,感谢您在这里帮助我。rownames(输出)我想我可能已经缩小了可能的错误源…我使用的数据帧有一些实例,其中特定区域只有一个与之关联的绘图(例如,区域5只有绘图5A)。因此,成对矩阵仅包括图5A与图5A的成对比较。这可能是错误的根源吗?在这种情况下,是否需要在循环中包含if-else语句?