【问题标题】:Multidimensional Histogram with R带 R 的多维直方图
【发布时间】:2015-09-16 17:11:30
【问题描述】:

假设我们有一个这样的数据框:

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)上计算此数据的直方图,并在每个维度中指定中断。显然,因子维度已经暗示了它们的中断。最终数据应该像 data.frame 一样,其中每一行都是跨所有维度的中断向量(中断组合)以及该组合的数据出现计数。 Python numpy 有 histogramdd:Multidimension histogram in 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)

【问题讨论】:

    标签: r histogram multi-dimensional-scaling


    【解决方案1】:

    我不知道预期的结果是什么,但这应该提供一个起点:

    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)
    

    【讨论】:

    • 看起来不错,只是用户必须为每个数字维度提供中断(或 bin 计数)。 “-1”有什么用?您的函数似乎正在返回所要求的内容:每一行都是跨所有维度的中断向量(中断组合)以及此组合的数据出现次数
    • 另一件事是'table(res)' 会爆炸数据大小。有没有办法只对非零计数执行此操作?是的,您当然可以执行 'h 0,]',但由于 'table(res)',它仍然会导致内存使用量激增。
    • 如果知道想要的结果究竟是什么,这可以得到改进。例如,我认为与 length 融合作为聚合函数可能是一种选择。您应该很容易调整功能,以便您可以手动提供休息时间。查看hist.default 的代码,了解一个相当全面的方法。
    • 好的,谢谢。是的,这对于大型数据集当然不是很好。对于我得到的每列有 10 列和 10 个中断的 DF:表中的错误(res):尝试使用 >= 2^31 个元素制作一个表
    • 好的,感谢您的帮助。我在上面发布了修改后的功能
    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多