如何确定数据帧中的两个单元是否属于相同的预先指定的因子级别

时间:2015-09-27 14:58:13

标签: r

我真的不知道如何更好地标题这个问题,所以请耐心等待。

library(reshape)
library(ggplot2)
library(dplyr)

dist1 <- matrix(runif(16),4,4)
dist2 <- matrix(runif(16),4,4)
rownames(dist1) <- colnames(dist1) <- paste0("A",1:4)
rownames(dist2) <- colnames(dist2) <- paste0("A",1:4)

m1 <- melt(dist1)
m2 <- melt(dist2)

final <- full_join(m1,m2, by=c("Var1","Var2"))
ggplot(final, aes(value.x,value.y)) + geom_point()

为了说明我的问题,我有一个生态距离矩阵(m1)和一个遗传距离(m2)的矩阵,用于许多生物物种。我已经合并了两个矩阵,并希望绘制两个距离。 这是扭曲: 生物物种属于某些群体,在数据框species中给出。我想检查ax,y对(如final$Var1final$Var2)是否属于同一组物种(此处&#34; cat&#34;或&#34; dog&#34; ),然后想要专门为它着色。 所以,我需要一个R翻译:

species <- data.frame(spcs=as.character(paste0("A",1:4)),
                  grps=as.factor(c(rep("cat",2),(rep("dog",2)))))

final$group <- If (final$Var1,final$Var2) belongs to the same group as specified
  in species, then assign the species group here, else do nothing or assign NA

所以我可以继续

ggplot(final, aes(value.x,value.y, col=group)) + geom_point()

非常感谢!

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是设置model = new DefaultTableModel() { @Override public Class getColumnClass (int column) { return (column == 0) ? Integer.class : String.class; } }; 数据框,其中两列与species中的X1X2对应,然后根据这两列进行合并列:

final

现在,您可以使用species <- data.frame(X1=paste0("A",1:4), X2=paste0("A",1:4), grps=as.factor(c(rep("cat",2),(rep("dog",2))))) final = merge(final, species, by=c("X1","X2"), all.x=TRUE) 作为颜色美学来绘制数据:

grps

答案 1 :(得分:1)

这是一种有效的方法。我对您提供的代码进行了一些更改。完整的工作示例代码如下所示。

library(reshape)
library(ggplot2)
library(dplyr)

dist1 <- matrix(runif(16), 4, 4)
dist2 <- matrix(runif(16), 4, 4)
rownames(dist1) <- colnames(dist1) <- paste0("A", 1:4)
rownames(dist2) <- colnames(dist2) <- paste0("A", 1:4)
m1 <- melt(dist1)
m2 <- melt(dist2)
# I changed the by= argument here
final <- full_join(m1, m2, by=c("X1", "X2"))

# I made some changes to keep spcs character and grps factor
species <- data.frame(spcs=paste0("A", 1:4), 
  grps=as.factor(c(rep("cat", 2), (rep("dog", 2)))), stringsAsFactors=FALSE)

# define new variables for final indicating group membership
final$g1 <- species$grps[match(final$X1, species$spcs)]
final$g2 <- species$grps[match(final$X2, species$spcs)]
final$group <- as.factor(with(final, ifelse(g1==g2, as.character(g1), "dif")))

# plot just the rows with matching groups
ggplot(final[final$group!="dif", ], aes(value.x, value.y, col=group)) + 
  geom_point()
# plot all the rows
ggplot(final, aes(value.x, value.y, col=group)) + geom_point()