输入文件是
Mydata <- read.table(con <- textConnection('
gene treatment1 treatment2 treatment3
aaa 1 0 1
bbb 1 1 1
ccc 0 0 0
eee 0 1 0
'), header=TRUE)
close(con)
Run Code Online (Sandbox Code Playgroud)
Mydata是
gene treatment1 treatment2 treatment3
1 aaa 1 0 1
2 bbb 1 1 1
3 ccc 0 0 0
4 eee 0 1 0
Run Code Online (Sandbox Code Playgroud)
为了构建集群,我已经完成了
d <- dist(mydata, method = "euclidean")
fit <- hclust(d, method="ward")
plot(fit)
Run Code Online (Sandbox Code Playgroud)
我得到了基于"欧几里德"距离的集群.
在我之前的stackoverflow消息中 如何使用R来计算Tanimoto/Jacquard Score作为距离矩阵
我发现我也可以用R来计算tanimoto-jacquard距离矩阵.你能不能教我如何将tanimoto-jacquard与前面的步骤结合起来得到一个基于tanimoto-jacquard距离而不是euclidean计算的距离矩阵的聚类?非常感谢.
你有什么不明白的??vegdist告诉我们它返回一个类的对象,"dist"所以你可以删除该dist(....)行并用一个调用替换它vegdist(....).例如:
require(vegan)
d <- vegdist(Mydata[, -1], method = "jaccard")
fit <- hclust(d, method="ward")
plot(fit)
Run Code Online (Sandbox Code Playgroud)
您需要删除第一列(并且应该在您在Q中显示的Euclidean版本中完成),因为这不是应该用于形成相异矩阵的数据.
这将产生一个警告:
Warning message:
In vegdist(Mydata[, -1], method = "jaccard") :
you have empty rows: their dissimilarities may be meaningless in method jaccard
Run Code Online (Sandbox Code Playgroud)
因为第3行不包含形成它与其他样本之间的jaccard距离的信息.您可能想要考虑在这种情况下jaccard是否最合适.
OP现在希望基因标签为行名.最简单的选择是在读取数据时告诉R,使用以下row.names参数read.table():
mydata2 <- read.table(con <- textConnection("gene treatment1 treatment2 treatment3
aaa 1 0 1
bbb 1 1 1
ccc 0 0 0
eee 0 1 0
"), header = TRUE, row.names = 1)
close(con)
Run Code Online (Sandbox Code Playgroud)
赠送:
> mydata2
treatment1 treatment2 treatment3
aaa 1 0 1
bbb 1 1 1
ccc 0 0 0
eee 0 1 0
Run Code Online (Sandbox Code Playgroud)
或者,如果数据已经在R中,并且重新加载和重做以前的计算很痛苦,只需将gene列分配给行名称并删除gene列(使用原始文件mydata):
rownames(mydata) <- mydata$gene
mydata <- mydata[, -1]
Run Code Online (Sandbox Code Playgroud)
赠送:
> mydata
treatment1 treatment2 treatment3
aaa 1 0 1
bbb 1 1 1
ccc 0 0 0
eee 0 1 0
Run Code Online (Sandbox Code Playgroud)