R 绘制数据集子集的核密度(以 char 变量为条件)

R plot kernel densities for subsets of a dataset (conditional on char variable)

我想为我的数据集的特定子集绘制核密度。子集将由 char 变量标识。 我的数据集具有以下结构(不是我的实际数据集,而是一般结构):

Char_var    var1   var2  var3  k_var
Material A                      2
Material B                      5
Material C                      7
Material A                      8
Material C                      4
.                               .
.                               .
.                               .

var1、var2、var3 是其他双打,但对于此图不是必需的。

一般来说,到目前为止我是这样编码的

dens1 <-  density(k_var) # How do I add an if statement for the Char_var here?
plot(dens1)

如果我这样做,我需要为数据集中的每个 material 编写上面的代码。是否有更优雅的编码方式,以便我获得每个 material 的密度图,或者我是否需要像我打算的那样为每个 material 拆分它? ...因为我的数据集中实际上有超过三个 material。 谢谢!

要获得密度,一种简单的方法是使用 tapply 循环。

dens <- tapply(dat$k_var, dat$char_var, density)

现在剧情。这些密度都绘制在同一张图中,应仅作为示例。

dx <- sapply(dens, function(d) range(d$x))
dy <- sapply(dens, function(d) range(d$y))

xlim <- c(min(dx[1, ]), max(dx[2, ]))
ylim <- c(min(dy[1, ]), max(dy[2, ]))

plot(0, type = "n", xlim = xlim, ylim = ylim, xlab = "", ylab = "")
for(i in seq_along(dens)){
  par(new = TRUE)
  plot(dens[[i]], main = "", col = i, xlab = "", xlim = xlim, ylim = ylim)
}

数据创建代码。

set.seed(1234)
dat <- data.frame(char_var = rep(LETTERS[1:4], each = 10),
                  k_var = rnorm(40))