0

假设我想通过列的所有因子值将简单的分位数回归应用于数据框中的列子集。

以 mtcars 为例。

data(mtcars)
cols <- c("mpg", "disp", "hp", "drat")
mtcars$cyl <- as.factor(mtcars$cyl)

这里我们cyl取值为 4、6 或 8 的因子。

cols现在假设我想对when中的每一列应用分位数回归cyl == 4, 6 and 8。我想将结果存储在列表列表中: store <- rep(list(list()), length(cols)) 因此store将有 4 个元素,每个元素对应于cols. 往下一层,列表有 3 个元素,每个元素对应cyl. 再往下走,每个元素都包含分位数回归的结果。

在 R 中执行此操作的最佳方法是什么?我试图用嵌套for循环来解决这个问题,但如果可能的话,我更愿意避免这种情况。

编辑:这是我的工作解决方案,但如果有更简单的方法不涉及使用,请告诉我reverseList()

store <- plyr:::dlply(mtcars, "cyl", function(d) {
  lapply(d[, cols], quantile, seq(0,1,0.2))
})
store <- paleotree:::reverseList(store)
4

1 回答 1

0

我可以建议使用该dlply功能,它似乎非常适合您的情况。

data(mtcars)
cols <- c("mpg", "disp", "hp", "drat")
mtcars$cyl <- as.factor(mtcars$cyl)

store <- lapply( cols, function(col.name) {
    mtcars %>% select( col.name, cyl ) %>%
        dlply("cyl", function(d2) {
        quantile( d2[,col.name], seq(0,1,0.2) )
    })
})
names( store ) <- cols

编辑:我更新了代码以表示我理解的问题。

建议的解决方案应该为您提供一个 4 元素列表,每列一个元素。然后在每个列表元素中有 3 个结果quantile,每个级别一个cyl

我经常发现使用 json 查看嵌套列表更容易:

jsonlite::toJSON( store, pretty=TRUE )
{
  "mpg": {
    "4": [21.4, 22.8, 24.4, 27.3, 30.4, 33.9],
    "6": [17.8, 18.32, 19.4, 20.48, 21, 21.4],
    "8": [10.4, 13.9, 15.04, 15.44, 16.76, 19.2]
  },
  "disp": {
    "4": [71.1, 78.7, 95.1, 120.1, 121, 146.7],
    "6": [145, 160, 163.04, 167.6, 213.52, 258],
    "8": [275.8, 290.92, 324.4, 358.2, 416, 472]
  },
  "hp": {
    "4": [52, 65, 66, 93, 97, 113],
    "6": [105, 110, 110, 117.8, 123, 175],
    "8": [150, 175, 180, 213, 245, 335]
  },
  "drat": {
    "4": [3.69, 3.77, 3.92, 4.08, 4.22, 4.93],
    "6": [2.76, 3.188, 3.732, 3.9, 3.916, 3.92],
    "8": [2.76, 3.042, 3.072, 3.15, 3.354, 4.22]
  }
} 
于 2021-03-09T11:43:33.263 回答