从两个向量创建带状疱疹

时间:2012-09-14 14:44:56

标签: r

我想根据两列对数据帧的值进行分类。比方说,我有以下数据框:

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

现在我想通过将2D散点图划分为4个相等的部分然后在中间覆盖一个由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

1 个答案:

答案 0 :(得分: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