【问题标题】:Apply function to a subset of columns by factor group按因子组将函数应用于列的子集
【发布时间】:2023-04-03 17:57:02
【问题描述】:

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

以 mtcars 为例。

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

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

现在假设我想在cyl == 4, 6 and 8 时对cols 中的每一列应用分位数回归。我想将结果存储在列表列表中: store &lt;- 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)

【问题讨论】:

    标签: r dplyr tidyverse data-wrangling quantile-regression


    【解决方案1】:

    我建议使用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 元素列表,每列一个元素。然后在每个列表元素中有quantile的3个结果,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]
      }
    } 
    

    【讨论】:

    • 谢谢,我还是有点卡在最后一部分;如何将分位数回归应用于 mtcars 的 cols 中的所有列? data(mtcars) cols &lt;- c("mpg", "disp", "hp", "drat") mtcars$cyl &lt;- as.factor(mtcars$cyl) store &lt;- rep(list(list()), length(cols)) your.list.of.lists &lt;- dlply( mtcars, "cyl", function(d) { quantile(mtcars$mpg, seq(0, 1, 0.1)) quantile(mtcars$disp, seq(0, 1, 0.1)) })
    • 我不知道.. O 有点印象你已经弄清楚了,只是想要一种方法来从中创建列表列表。你想从中得到什么?参数?也许您可以创建一个示例来说明您的结果应该是什么样子
    • 谢谢,我已经更新了 OP 以反映我想要的结果。这不应该是一个巨大的飞跃,但我有点卡住了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多