在R中如何在计算quantile()时排除某些行

时间:2016-04-05 16:19:22

标签: r subset

我有兴趣根据另一列计算数据框中列的quantile函数,仅用于行的子集。

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

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

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

我查看了this,看看它是否有用,但无法解读部分代码。

由于

1 个答案:

答案 0 :(得分:1)

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

但是,不建议像您一样提取子集数据框。 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)

我假设你有另一个级别&#34; N&#34;,所以对于那个级别你可以做

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, ...)将根据quantile(x1, ...)应用x2。如果你在x2中有10个等级,那么你得到所有这些等级的0.25分位数。