我对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”的内容如此link所示。
此外,我有数百列,因此无法使用as.numeric(table$B)
答案 0 :(得分:2)
您可以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),因此每个表中都不会显示所有值 - 因此rbind
将不起作用。来自rbind.fill
包的plyr
用NA
填充。
下面用零替换缺少的(NA
)
mat[is.na(mat)] <- 0