在 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_var
、in_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 分位数。
我有兴趣计算数据框中某列的 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_var
、in_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 分位数。