I have a dataframe:
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
}
以下是输出的样例(注意:它们的尺寸不同,可能包含NA值):
[[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
我想对这个矩阵列表应用一个函数,将其格式更改为一个数据框。 数据框的一列将是矩阵元素,第二列将是矩阵的行和列维度,第三列将是包含矩阵填充值的
freq
列。 对于此示例,输出如下所示:(注意:NAs不被考虑。)output<-
x y freq
1 1A_1B 0
1 1A_1C 1
1 1A_1D 0
1 1B_1C 0
1 1B_1D 0
1 1C_1D 0
2 2A_2B 2
2 2A_2C 1
2 2A_2D 1
2 2B_2C 1
2 2B_2D 1
2 2C_2D 0
3 3A_3B 1
我不反对更有效的代码,将第一个/原始数据框转换为此输出数据框,以避免循环和矩阵列表。
seq_along
。 - lmopos <- which(!is.na(results[[i]]), arr.ind=TRUE)
之后,您可以添加一行pos <- pos[pos[, 1] != pos[, 2], ]
来删除任何非 NA 对角线元素。 - lmo