如何解决按因子组将函数应用于列的子集
假设我想通过列的所有因子值对数据框中的列子集应用简单的分位数回归。
以 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]
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。