我对 R 非常陌生。我有一个 csv 文件,看起来像
A B C D
A1 a v a
A2 v v a
A3 a a a
我想使用它制作一个共现图
,但我不知道当输入有字符而不是数字时如何绘制它。
我尝试使用一些软件包(我无法让它们中的任何一个工作),其中一个是cooccurr
。它给了我以下错误“rowSums(spp_site_mat,na.rm = T)中的错误:'x'必须是数字”
。
如果您向我指出任何有用的内容或提供任何代码建议,我将非常感激。
编辑:
行将具有 A 列的值,列将是其相应的值,“a”和“v”如 link 所示。 .
此外,我有数百列,因此我无法使用 as.numeric(table$B)
将每一列更改为数字
最佳答案
您可以表格
每一行来计算唯一值,然后使用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 将不起作用。 plyr
包中的 rbind.fill
用 NA
填充。
下面用零替换缺失的 (NA
)
mat[is.na(mat)] <- 0
关于r - R 中的共现图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26129038/