2012-09-14 25 views
1

我想根据两列对数据帧的值进行分类。比方说,我已经得到了以下数据帧:从两个向量创建带状疱疹

my.df <- data.frame(a=c(1:20), b=c(61:80)) 

,现在我想通过将二维散点图分为4个等份,然后在将包括中间覆盖一个矩形,它细分为8个区域的四分之一的四分之一。到目前为止,我一直在使用以下方式繁琐:

ar <- range(my.df$a) 
br <- range(my.df$b) 

aint <- seq(ar[1], ar[2], by=(ar[2]-ar[1])/4) 
bint <- seq(br[1], br[2], by=(br[2]-br[1])/4) 

my.df$z <- NA 
my.df[which(my.df$a < aint[3] & my.df$b < bint[3]),"z"] <- 1 
my.df[which(my.df$a < aint[3] & my.df$b >= bint[3]),"z"] <- 2 
... 
my.df[which(my.df$z == 1 & my.df$a >= aint[2] & my.df$b >= bint[2]),"z"] <- 5 
... 

我相信一定有办法做到这一点在一个整洁,更全面的方式,通过写一个通用的函数,即,但我很努力自己写一个。

此外,我很惊讶地看到,在所有这一切后,列z的类自动设置为shingle。为什么? R如何“知道”这是一个shingle

+2

你必须有一些ü被加载的nnamed软件包或附加了一些数据框或...某事。 “z”的类是“数字” –

+0

@DWin我猜它是'lattice'或'latticeExtra',但我不确定。 – AnjaM

回答

1

我会先将它切成16个组(首先将x和y分成4组),然后再将它们组合成更少的组。

my.df$a.q <- cut(my.df$a, breaks=4, labels=1:4) 
my.df$b.q <- cut(my.df$b, breaks=4, labels=1:4) 
my.df$a.b.q <- paste(my.df$a.q, my.df$b.q, sep=".") 
my.df$z <- c("1.1"=1, "1.2"=1, "1.3"=2, "1.4"=2, 
      "2.1"=1, "2.2"=3, "2.3"=4, "2.4"=2, 
      "3.1"=5, "3.2"=6, "3.3"=7, "3.4"=8, 
      "4.1"=5, "4.2"=5, "4.3"=8, "4.4"=8)[my.df$a.b.q] 

这似乎是合理的

plot(my.df$a, my.df$b, col=my.df$z) 

随着一些数据与更多的报道:

set.seed(1234) 
my.df <- data.frame(a=runif(1000, 1, 20), b=runif(1000, 61, 80)) 

enter image description here

+0

感谢您的回答!您是否了解如何创建'z'可以以更一般的方式完成,例如,如果我想要将轴分成四个以上的部分,分区越多,分配“集群”就越麻烦,而且我试图使用' col = my.df $ abq'用于绘图,以便16个种群变为有色,但只有4个种群(根据'a'细分)变色,尽管'length(unique(my.df $ abq))'为16。为什么是aren ''根据'abq'中的唯一条目分配的颜色? – AnjaM

+0

感谢Brian!我非常喜欢你的切割和矢量索引方法。 – AnjaM

相关问题