在 R 中如何在计算分位数时排除某些行()

In R how to exclude certain rows when calculating quantile()

我有兴趣计算数据框中某列的 quantile 函数,仅针对基于另一列的行子集。

例如,我有一个包含 "Y" 或 "N" 的 new_user_indicator 列,我想知道 "Y" 组的分位数。目前我在做

quantile(subset_df$limit_amount, .25)
subset_df <- subset(carddata, new_user_indicator == "Y")

有没有一种方法可以在一个命令中执行此操作而不是创建子集数据框?

我查看了 this 看它是否有帮助,但无法破译部分代码。

谢谢

分位数函数本身不允许您对子集进行操作。所以你确实需要一些方法来提取子集数据。

但是,不建议像您那样提取子集数据框。 quantile 接受向量,因此您只需要对列而不是整个数据框进行子集化。

quantile(with(carddata, limit_amount[new_user_indicator == "Y"]), 0.25)

with函数帮助提取列,否则需要

quantile(carddatal$imit_amount[carddata$new_user_indicator == "Y"], 0.25)

更新

如果你要重复这样做,那么写一个函数(把函数名foo改成你喜欢的)

foo <- function(df, out_var, in_var, in_level, prob) {
  quantile(df[[out_var]][df[[in_var]] == in_level], prob)
  }

那么你可以这样做:

foo(carddata, "limit_amount", "new_user_indicator", "Y", 0.25)

我假设你有另一个级别"N",所以对于那个级别你可以做

foo(carddata, "limit_amount", "new_user_indicator", "N", 0.25)

这里,out_varin_var 是输出变量和输入变量的列名(因此是一个字符串)。 in_level 是输入变量的级别。你知道 prob 是干什么用的。


更强大的方式

如果你想要 所有 级别的输入变量为 0.25,那么使用我的函数仍然很愚蠢。使用 tapply

tapply(carddata$limit_amount, cardata$new_user_indicator, FUN = quantile, prob = 0.25)

tapply(x1, x2, FUN, ...) 将根据 x2 应用 quantile(x1, ...)。如果您在 x2 中有 10 个级别,那么您将获得所有级别的 0.25 分位数。