假设我们有一个这样的数据帧:
dat <- data.frame(
a = rnorm(1000),
b = 1/(rnorm(1000))^2,
c = 1/rnorm(1000),
d = as.factor(sample(c(0, 1, 2), 1000, replace=TRUE)),
e = as.factor(sample(c('X', 'Y'), 1000, replace=TRUE))
)
我们希望在所有维度(即a, b, c, d, e)上计算该数据的直方图,并在每个维度上指定断点。显然,因子维度已经暗示了它们的断裂。最终的数据应该像一个数据框架,其中每行是跨所有维度的断点向量(断点的组合)和该组合的数据出现计数。Python numpy有histogramdd: Python的多维直方图。R中有类似的东西吗?在R中做这个的最好方法是什么?谢谢你。
我最终使用了以下代码,其中bin计数作为最后一行传递给函数:
dat <- data.frame(
a = rnorm(1000),
b = 1/(rnorm(1000))^2,
c = 1/rnorm(1000),
d = as.factor(sample(c(0, 1, 2), 1000, replace=TRUE)),
e = as.factor(sample(c('X', 'Y'), 1000, replace=TRUE))
)
dat[nrow(dat)+1,] <- c(10,10,10,NaN,NaN)
histnd <- function(df) {
res <- lapply(df, function(x) {
bin_idx <- length(x)
if (is.factor(x) || is.character(x)) {
return(x[-bin_idx])
}
#
x_min <- min(x[-bin_idx])
x_max <- max(x[-bin_idx])
breaks <- seq(x_min, x_max, (x_max - x_min)/x[bin_idx])
cut(x[-bin_idx], breaks)
})
res <- do.call(data.frame, res)
res$FR <- as.numeric(0)
res <- aggregate(FR ~ ., res, length)
}
h <- histnd(dat)
我不知道预期的结果是什么,但这应该提供了一个起点:
histnd <- function(DF) {
res <- lapply(DF, function(x) {
if (is.factor(x) || is.character(x)) return(x)
breaks <- pretty(range(x), n = nclass.Sturges(x), min.n = 1)
cut(x, breaks)
})
res <- do.call(data.frame, res)
as.data.frame(table(res))
}
h <- histnd(dat)