R:创建一个函数来识别任意百分位数

2024-02-24

我正在使用 R 编程语言。

我有以下数据集:

library(dplyr)

var1 = rnorm(10000, 100,100)
var2 = rnorm(10000, 100,100)
var3 = rnorm(10000, 100,100)
var4 = rnorm(10000, 100,100)
id = 1:10000

final = data.frame(id, var1, var2, var3, var4)

假设我想根据另一个变量(例如 var3)的十分位值创建一个新变量。我可以使用以下代码来执行此操作:

final_without_function = final %>%
  mutate(class3 = case_when(ntile(var3, 10) == 1 ~ paste0(round(min(var3), 2), " to ", round(quantile(var3, 0.1), 2), " decile 1"),
                            ntile(var3, 10) == 2 ~ paste0(round(quantile(var3, 0.1), 2), " to ", round(quantile(var3, 0.2), 2), " decile 2"),
                            ntile(var3, 10) == 3 ~ paste0(round(quantile(var3, 0.2), 2), " to ", round(quantile(var3, 0.3), 2), " decile 3"),
                            ntile(var3, 10) == 4 ~ paste0(round(quantile(var3, 0.3), 2), " to ", round(quantile(var3, 0.4), 2), " decile 4"),
                            ntile(var3, 10) == 5 ~ paste0(round(quantile(var3, 0.4), 2), " to ", round(quantile(var3, 0.5), 2), " decile 5"),
                            ntile(var3, 10) == 6 ~ paste0(round(quantile(var3, 0.5), 2), " to ", round(quantile(var3, 0.6), 2), " decile 6"),
                            ntile(var3, 10) == 7 ~ paste0(round(quantile(var3, 0.6), 2), " to ", round(quantile(var3, 0.7), 2), " decile 7"),
                            ntile(var3, 10) == 8 ~ paste0(round(quantile(var3, 0.7), 2), " to ", round(quantile(var3, 0.8), 2), " decile 8"),
                            ntile(var3, 10) == 9 ~ paste0(round(quantile(var3, 0.8), 2), " to ", round(quantile(var3, 0.9), 2), " decile 9"),
                            ntile(var3, 10) == 10 ~ paste0(round(quantile(var3, 0.9), 2), " to ", round(max(var3), 2), " decile 10")))

假设现在我不想按“10”组进行操作,而是想按“5”组进行操作 - 我需要手动更改上述代码。我正在寻找一种更方便的方法来做到这一点。

我尝试编写这个函数来执行此操作:

percentile_classifier <- function(x, n_percentiles) {
  # Calculate the percentiles
  percentiles <- quantile(x, probs = seq(0, 1, 1/n_percentiles))

  # Create a character vector to store the labels
  labels <- character(length(x))

  # Loop through each percentile and assign the corresponding label to each element in the vector
  for (i in 1:length(percentiles)) {
    lower <- percentiles[i]
    upper <- ifelse(i == length(percentiles), max(x), percentiles[i+1])
    label <- paste0(round(lower, 2), " to ", round(upper, 2), " percentile ", i)
    labels[x >= lower & x < upper] <- label
  }

  # Return the labels
  return(labels)
}

但是当我尝试调用这个函数时:

final <- final %>% mutate(class3 = percentile_classifier(var3, 20))

我不确定我是否正确地做到了这一点。

有人可以告诉我我这样做是否正确吗?

Thanks!

Note:我所说的根据“分组”数据计算的百分位数是什么意思:

final = final %>% group_by (factor_var_5,factor_var_6, factor_var_7) %>%
  mutate(class3 = case_when(ntile(var3, 10) == 1 ~ paste0(round(min(var3), 2), " to ", round(quantile(var3, 0.1), 2), " decile 1"),
                            ntile(var3, 10) == 2 ~ paste0(round(quantile(var3, 0.1), 2), " to ", round(quantile(var3, 0.2), 2), " decile 2"),
                            ntile(var3, 10) == 3 ~ paste0(round(quantile(var3, 0.2), 2), " to ", round(quantile(var3, 0.3), 2), " decile 3"),
                            ntile(var3, 10) == 4 ~ paste0(round(quantile(var3, 0.3), 2), " to ", round(quantile(var3, 0.4), 2), " decile 4"),
                            ntile(var3, 10) == 5 ~ paste0(round(quantile(var3, 0.4), 2), " to ", round(quantile(var3, 0.5), 2), " decile 5"),
                            ntile(var3, 10) == 6 ~ paste0(round(quantile(var3, 0.5), 2), " to ", round(quantile(var3, 0.6), 2), " decile 6"),
                            ntile(var3, 10) == 7 ~ paste0(round(quantile(var3, 0.6), 2), " to ", round(quantile(var3, 0.7), 2), " decile 7"),
                            ntile(var3, 10) == 8 ~ paste0(round(quantile(var3, 0.7), 2), " to ", round(quantile(var3, 0.8), 2), " decile 8"),
                            ntile(var3, 10) == 9 ~ paste0(round(quantile(var3, 0.8), 2), " to ", round(quantile(var3, 0.9), 2), " decile 9"),
                            ntile(var3, 10) == 10 ~ paste0(round(quantile(var3, 0.9), 2), " to ", round(max(var3), 2), " decile 10")))

您的代码非常接近,但不太正确。如果我们在一个很好的小示例而不是 10,000 行数据帧上运行它,这一点就很清楚了:

set.seed(42)
n = 15
var1 = rnorm(n, 100,100)
id = 1:n

final = data.frame(id, var1)

# final %>% mutate(result = percentile_classifier(var1, 5))
#    id      var1                        result
# 1   1 237.09584 149.57 to 239.91 percentile 4
# 2   2  43.53018  -38.89 to 83.76 percentile 1
# 3   3 136.31284  92.45 to 149.57 percentile 3
# 4   4 163.28626 149.57 to 239.91 percentile 4
# 5   5 140.42683  92.45 to 149.57 percentile 3
# 6   6  89.38755   83.76 to 92.45 percentile 2
# 7   7 251.15220 239.91 to 328.66 percentile 5
# 8   8  90.53410   83.76 to 92.45 percentile 2
# 9   9 301.84237 239.91 to 328.66 percentile 5
# 10 10  93.72859  92.45 to 149.57 percentile 3
# 11 11 230.48697 149.57 to 239.91 percentile 4
# 12 12 328.66454                               ## Problem - the max isn't labeled
# 13 13 -38.88607  -38.89 to 83.76 percentile 1
# 14 14  72.12112  -38.89 to 83.76 percentile 1
# 15 15  86.66787   83.76 to 92.45 percentile 2

我们可以看到最大值没有得到标签。知道了问题所在,就很容易找到这个bug了。您的函数分配标签labels[x >= lower & x < upper] <- label,但当然最大值永远不会是严格小于本身就是最高的upper价值。您可以通过将其视为特殊情况来修复该错误。

相反,让我们依赖基本函数cut这是 R 的内置方式来对这样的值进行分箱。 (参见?cut帮助页面或 Stack Overflow 常见问题解答如何对数值进行分箱 https://stackoverflow.com/q/5570293/903061更多细节。)

cut有一个内置参数决定是否包含端点。它还默认为排除最低点并包括最高点的间隔,但这可以通过参数进行自定义right如果你想改变它。

ptile <- function(x, n_percentiles) {
  # Calculate the percentiles
  pct <- quantile(x, probs = seq(0, 1, 1/n_percentiles))

  # Create a character vector to store the labels
  labels <- sprintf("%.2f to %.2f percentile %d",
                    head(pct, -1), tail(pct, -1), seq_len(n_percentiles))

  cut(x, breaks = pct, labels = labels, include.lowest = TRUE)
}

final %>% mutate(result = ptile(var1, 5))
#    id      var1                        result
# 1   1 237.09584 149.57 to 239.91 percentile 4
# 2   2  43.53018  -38.89 to 83.76 percentile 1
# 3   3 136.31284  92.45 to 149.57 percentile 3
# 4   4 163.28626 149.57 to 239.91 percentile 4
# 5   5 140.42683  92.45 to 149.57 percentile 3
# 6   6  89.38755   83.76 to 92.45 percentile 2
# 7   7 251.15220 239.91 to 328.66 percentile 5
# 8   8  90.53410   83.76 to 92.45 percentile 2
# 9   9 301.84237 239.91 to 328.66 percentile 5
# 10 10  93.72859  92.45 to 149.57 percentile 3
# 11 11 230.48697 149.57 to 239.91 percentile 4
# 12 12 328.66454 239.91 to 328.66 percentile 5
# 13 13 -38.88607  -38.89 to 83.76 percentile 1
# 14 14  72.12112  -38.89 to 83.76 percentile 1
# 15 15  86.66787   83.76 to 92.45 percentile 2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R:创建一个函数来识别任意百分位数 的相关文章

  • 如何减小 R Plot 中图例的大小,同时仍使其可读?

    我试图用 R 中的两个 y 轴绘制多年来的一些数据 但是 每当我尝试包含图例时 图例就会主导我的绘图 当我使用其他地方建议的解决方案时 例如keyword和 或使用cex论据 在另一篇文章中建议here https stackoverflo
  • R闪亮的html小部件之间的交互

    我正在开发一个 R 闪亮应用程序 它使用多个 html 小部件 特别是网络D3 d3热图 and 和弦诊断 这些小部件单独工作正常 但是 在同一页面中使用它们会留下一个空格处他们应该在哪里 这是显示错误的可重现代码 在 UI 中注释绘图线
  • ggplot:按组自动化的百分位线

    我找到了dplyr gt 运算符有助于简单的 ggplot2 转换 无需求助于ggproto 这是必需的ggplot2 扩展 http docs ggplot2 org dev vignettes extending ggplot2 htm
  • 反转默认比例梯度ggplot2

    我是新手 我正在尝试设计热图 这是我的代码 ggplot gd aes Qcountry Q6 1 Q6d order TRUE geom tile aes fill prob colour white theme minimal labs
  • 尽管提供了群落矩阵,纯素食 DBRDA 物种得分为空

    我使用纯素社区生态包在 R 中执行了 基于距离的冗余分析 dbRDA 我想在 dbRDA 结果的排序图中显示 鱼类 营养群体对样本之间差异 营养级鱼类组合的丰度数据 的相对贡献 IE 将箭头和营养级组名称叠加到排序图上 其中箭头线的长度表示
  • 在 Shiny 中使用 readlines(prompt = )

    我有一个代码 使用以下方式获取输入readlines prompt 功能 您能告诉我 Shiny 中的哪个输入函数足以将此代码适应 Shiny 应用程序吗 我需要一个交互功能 我无法使用简单的输入selectInput 因为我有很多read
  • R比例置信区间因子

    我正在尝试总结家庭调查的数据 因此我的大部分数据都是分类 因子 数据 我想用对某些问题的回答频率图来总结它 例如 回答某些问题的家庭百分比的条形图 误差线显示置信区间 我发现了这个很棒的教程 我认为它是我祈祷的答案 http www coo
  • readRDS() 加载额外的包

    什么情况下会出现readRDS R 中的函数尝试加载包 命名空间 我很惊讶地在新的 R 会话中看到以下内容 gt loadedNamespaces 1 base datasets graphics grDevices methods sta
  • 使用 SparkR 1.5 从 RStudio 中的 hdfs 读取大文件(纯文本、xml、json、csv)的选项

    我是 Spark 新手 想知道除了下面的选项之外是否还有其他选项可以使用 SparkR 从 RStudio 读取存储在 hdfs 中的数据 或者我是否正确使用它们 数据可以是任何类型 纯文本 csv json xml 或任何包含关系表的数据
  • 在ggplot2中创建部分虚线

    我正在 R 中创建一个图 并且需要创建一条线 其中某些值是投影 投影用虚线表示 这是代码 df data frame date c rep 2008 2013 by 1 value c 303 407 538 696 881 1094 gg
  • R:在 Shiny 中,如何修复应用于“反应性”类对象的“xtable”没有适用的方法

    我收到此错误 Error in UseMethod xtable no applicable method for xtable applied to an object of class reactive UI R library shi
  • 我可以调整scale_color_brewer的下限吗?

    我已经订购了我想使用 color Brewer 的分类数据 但我很难看到非常低的值 有没有办法去掉这些较低的值或设置范围的下限 ggplot data frame x 1 6 y 10 15 w letters 1 6 aes x y co
  • 如何在 Shiny 中动态渲染的 textInput 添加样式元素

    你好堆栈溢出 在我最近提出的问题中 我已经解决了一些与动态渲染 UI 元素相关的主要问题 并在一些了不起的人的帮助下动态创建了观察者 参见此处 动态渲染的 UI 如何在第二次运行时删除旧的反应变量 https stackoverflow c
  • 如何在multilist中设置xlim?

    以下代码创建 3 个向量 并将它们显示为交错直方图 a lt c 1 2 3 b lt c 1 1 2 c lt c 1 1 1 l lt list a b c multhist l col c red green blue xlim c
  • 如何使用r中的dplyr在特定位置插入空白行

    我想在数据框中的特定位置插入空白行 我的数据框是这样的 dat lt data frame group c rep A 1 rep B 4 rep C 2 rep D 2 group 1 A 2 B 3 B 4 B 5 B 6 C 7 C
  • 无法在 Powershell 中运行 R.exe

    我经常发现在命令行 Windows 上运行 R 更有用 然而 当我在 Powershell 中尝试时 我往往会遇到问题 但这可以通过第一次运行轻松克服cmd然后就可以了 这是我执行此操作时遇到的错误R CMD BATCH Invoke Hi
  • 在 R Shiny 中显示/隐藏整个框元素

    我目前正在尝试找到一种方法来隐藏 显示 R Shiny 中的整个 box 元素 以及里面的所有内容 我想创建一个可能的按钮 它允许用户展开特定框 然后使用相同 甚至不同 的按钮隐藏它 我不想使用条件面板 因为我的应用程序非常大并且会产生一些
  • 如何将 mcmc.list 转换为 bugs 对象?

    我正在使用rjagsR 库 功能coda samples产生一个mcmc list 例如 来自example coda samples library rjags data LINE LINE recompile LINE out lt c
  • R:如何更改ggvis闪亮应用程序中特定范围的绘图背景颜色

    I have a simple shiny app like below and you can run it The plots are created by ggvis and user can choose student name
  • 替换rmarkdown/knitr/pdf中字幕的自动编号

    我正在使用 Rmarkdown 生成 PDF 文档 我想在其中手动定义图号 下面是一个块的示例 r chunk26 fig cap Fig 5 3 My figure caption plot 1 1 我使用特殊的编号来遵循文档的章节 问题

随机推荐

  • 如何将 Unix 时间戳转换回时间?

    我有以下 Unix 时间戳 1301982430 1301982430 1301981474 1301981466 1301981466 1301981066 1301981058 1301981058 1301980388 1301980
  • Sustainsys.SAML2 与多租户应用程序

    我正在开发一个多租户应用程序 Blazor 应用程序 我正在使用 Sustainsys Saml2 AspNetCore2 包 我有一个测试 Blazor 应用程序正在运行 可以授权测试https stubidp sustainsys co
  • 使用 MSBuild 从命令行定义预处理器值[重复]

    这个问题在这里已经有答案了 我需要创建由多个项目组成的现有大型应用程序的演示版本 我想使用现有的项目 并通过预处理器指令中性化功能 if DEMO mycode NeuterNow endif 我们正在使用 MSBuild 构建我们的应用程
  • JSON.NET \ 如何在 Json.net 中连接两个 JSON

    我有两个 JSON 作为简单字符串 有没有巧妙的方法来连接它们 作为基础设施的一部分 string j1 a 1 string j2 b 2 var j JsonConvert SerializeObject new JsonConvert
  • vue bootstrap b-collapse:当侧边栏折叠时,更改margin-left内容div

    我对 Vue Bootstrap b collapse 导航栏 侧边栏 内容 有疑问 https jsfiddle net Lvkjn7he 1 https jsfiddle net Lvkjn7he 1 当点击 navbar toggle
  • cakephp 使用 mysql SQL_CALC_FOUND_ROWS 进行分页

    我试图让 Cakephp 分页利用 mysql 中的 SQL CALC FOUND ROWS 功能来返回总行数 同时使用 LIMIT 希望这可以消除 paginateCount 然后 paginate 的双重查询 http dev mysq
  • 如何合并两个图像

    我有一个单一的图像 我有一个带有横幅图像的集合视图 现在 我需要将这两个图像组合成单个图像 而不影响它们的质量和高度 以便我能够下载合并的图像 我搜索但找不到 swift 3 的正确解决方案 我的代码如下 根据你的问题 你必须添加两个图像并
  • 如何在 Swift 中的泛型类上实现 NSCoding?

    我在 Swift XCode beta 5 中的泛型类和 NSCoding 方面遇到问题 具体来说 此示例代码运行良好 class Foo NSObject NSCoding let bar String init bar String s
  • 调用 API 期间出现 cURL 错误。 cURL 错误号:[60] SSL 证书问题:证书链中的自签名证书

    美好的一天 我是服务器设置的新手 我目前正在使用 laravel 5 4 来集成我的快书应用程序 https github com intuit QuickBooks V3 PHP SDK在我的实时服务器上http qb dagnum co
  • sql中的连续天数

    我发现了很多有关连续几天的 stackoverflow QnAs 答案仍然太短 我无法理解发生了什么 为了具体起见 我将制作一个模型 或表格 如果有什么区别的话 我正在使用 postgresql CREATE TABLE work id i
  • 在 JavaScript 中解析 jQuery 数据 (JSON)

    我正在使用 PHP jQuery 和 JSON 现在我需要知道如何在 JavaScript 中解析 jQuery 数据 load php 它通过以下数据返回 jQuery name STA distance 250 code 25 name
  • 同一任务执行多次

    我有 ETA 任务发送到 Celery 的 Redis 代理 它是一个 celery 和 redis 实例 两者都在同一台机器上 问题是 任务被执行多次 我见过任务执行了 4 到 11 次 鉴于我的预计到达时间在 4 11 小时之间 在运行
  • Dropbox 中未同步的 Git 存储库

    我有一个 git 存储库 和工作目录 存储在我的 Dropbox 中 这样我就可以在计算机之间来回移动 而无需提交或存储 阅读 完全不需要任何努力 这一切都很有效 除了一个小烦恼正在变成一个大烦恼之外 每隔一段时间 我会让一台计算机处于完全
  • 如何以编程方式确定当前类的Java字节码版本? [复制]

    这个问题在这里已经有答案了 我遇到的情况是 部署平台是 Java 5 并且开发是在 Java 6 下使用 Eclipse 进行的 我们建立了一个在开始处理给定项目时创建新工作区的过程 因此 所需步骤之一是将编译器级别设置为 Java 5 这
  • 在 AWS Lambda Layers 中找到等效的环境变量?

    我正在 AWS 上编写一个无服务器应用程序 我已将该应用程序分解为许多 Clo udFormation 堆栈 我正在使用 CDK Python 中 创建 CF 堆栈来部署应用程序 当然 我的 lambda 函数的核心要求是能够记录事件 为了
  • 如何获取 ScrollController 的完整大小

    我已将 ScrollController 附加到 SliverAppBar SliverList 的 CustomScrollView 在默认情况下 我会使用reverse true和animateTo 0 0 将滚动移动到添加的最后一个元
  • 没有为“listen ... ssl”指令定义“ssl_certificate”

    我正在尝试为我的网站配置 nginx 服务器 我正在使用以下代码来配置我的服务器 如果我为 www fastenglishacademy fr 443 服务器块添加 default server 它就会起作用 但在这种情况下 我的所有子域也
  • Firebase webpack+babel 功能未部署

    是否可以使 firebase 函数与 webpack 和 babel 一起使用 我们需要在服务器端重用现有的 ES6 类 但我们无法编辑这些类 因此我们需要转译它们以使其在 Node 中工作 花了两天时间学习相关教程 但我遇到了一个问题 即
  • 如何防止用户在iOS上截取应用程序的屏幕截图?

    我想防止用户对我的应用程序进行屏幕截图 并在最近的项目上隐藏其内容 你知道相当于Android的吗FLAG SECURE特征 https developer android com reference android view Window
  • R:创建一个函数来识别任意百分位数

    我正在使用 R 编程语言 我有以下数据集 library dplyr var1 rnorm 10000 100 100 var2 rnorm 10000 100 100 var3 rnorm 10000 100 100 var4 rnorm