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

时间:2019-05-06 04:38:40

标签: r if-statement plot kernel-density

我想为我的数据集的特定子集绘制内核密度。子集将由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)

如果我这样做,则需要为数据集中的每种材料编写以上代码。有没有一种更优雅的编码方式,使得我可以得到每种材料的密度图,或者我需要按计划将其分解为每种材料? ...因为我的数据集中有3种以上的材料。 谢谢!

1 个答案:

答案 0 :(得分:1)

要获得密度,一种简单的方法是使用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)
}

enter image description here

数据创建代码。

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