我对R非常陌生,我有一个csv文件,看起来
A B C D
A1 a v a
A2 v v a
A3 a a a
我想用它制作一个co occurrence plot
,但是当输入有字符而不是数字时,我想不出如何绘制它。
我试过使用几个包(我无法让它们任何一个工作),其中一个是cooccur
。它给了我以下错误"Error in rowSums(spp_site_mat, na.rm = T) : 'x' must be numeric"
。如果你能给我指点任何有用的东西或者给出任何代码建议,我会非常感激的。
编辑:
行将有来自A列的值,列将是它们的对应值,"a“和"v”,如这个链接所示。
此外,我有数百个列,因此不能使用as.numeric(table$B)
将每一列更改为数字。
发布于 2014-09-30 13:39:25
您可以使用table
每一行来计数唯一的值,然后使用rbind.fill
形成一个矩阵。然后,可以使用geom_tile
将计数作为标签添加到绘图中。
# your data
dat <- read.table(text="A B C D
A1 a v a
A2 v v a
A3 a a a", header=TRUE)
library(plyr)
library(ggplot2)
library(reshape2)
# transform your data
mat <- rbind.fill.matrix(apply(dat[-1], 1, function(i) t(as.matrix(table(i)))))
mat[is.na(mat)] <- 0
rownames(mat) <- dat$A
# plot
ggplot(melt(mat), aes(Var2, Var1, fill=value)) +
geom_tile() +
scale_fill_gradient(limits=c(0,3), low="white") +
geom_text( aes(label=value))
编辑
关于代码
mat <- rbind.fill.matrix(apply(dat[-1], 1, function(i) t(as.matrix(table(i)))))
从里面开始
apply(dat[-1], 1, function(i) t(as.matrix(table(i))))
apply
和MARGIN = 1
将函数应用于数据行,不包括第一列。该函数的目的是为每一行列出值。as.matrix
用于改变输出的格式,t
(转置)改变矩阵的方向。(这很可能是一种更简洁的方法)
由于每行中可能没有相同的值(第3行没有v's),所有值都不会在每个表中表示--因此rbind
将无法工作。来自plyr
包的plyr
填充了NA
。
下面将缺失(NA
)替换为零
mat[is.na(mat)] <- 0
https://stackoverflow.com/questions/26129038
复制相似问题