1-我想制作一个数据框或矩阵,每列与另一列不同(至少50%不同)
我所做的就是例如
M <- data.frame(matrix(runif(5),10000,50))
然后我想找到M
中每列最大值的位置和值我可以使用
找到每列最大值的位置indexmax <- apply(M, MARGIN = 2, function(x) which(x == max(x), arr.ind = TRUE))
我现在的主要问题是如何制作一个显示这些指数位置的图表
X轴范围从1到列数 在Y轴范围从1到行数
然后突出显示最大值是在数据的底行还是顶行
答案 0 :(得分:1)
这是你想要的吗?
library(reshape2)
library(ggplot2)
M <- data.frame(matrix(runif(100), ncol=10))
res <- sapply(M, function(x) x>=max(x))
where <- sapply(M, function(x) which.max(x)>length(x)/2)
where <- data.frame('x'=1:ncol(M), 'y'=0, 'label'=factor(where, labels=c("sup", "inf")))
ggplot(data=melt(t(res))) +
geom_tile(aes(x=Var1, y=Var2, fill=value))+
scale_y_reverse() + xlab("columns") + ylab("rows") +
geom_text(data=where, aes(x=x, y=y, label=label)) +
guides(fill=guide_legend(title="is maximum?"))
该脚本创建一个随机矩阵,然后创建一个M的逻辑副本,告诉每个值是否为最大值。而不是它创造了一个&#39;其中&#39;向量告知每列是否在顶行中具有最大值,并将此向量转换为命名的2级因子。最终,它使用ggplot和reshape来绘制两个信息,并使用&#39; tile&#39;可视化。
修改强> 鉴于你有一个非常大的矩阵(30000 * 2000),绘制最大值的位置将是完全无用的。相反,我们可以绘制它在矩阵的上部或下部的信息:
M <- data.frame(matrix(runif(20000), ncol=2000))
res <- sapply(M, function(x) x>=max(x))
where <- sapply(M, function(x) which.max(x)>length(x)/2)
image(as.matrix(cbind(!where, where)))
红色表示每列中的最大值。 但是,如果您的数据每列有几个最大值,请小心使用which.max函数,此图形表示可能会产生误导。