按因子组将函数应用于列的子集

问题描述

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

以 mtcars 为例。

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

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

现在假设我想在 cols 时对 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)

解决方法

我建议您使用 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,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]
  }
} 

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...