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