根据另一列前50位的排名,从一列的子集中查找平均值

时间:2015-09-24 18:41:39

标签: r

我的数据框包含以下列:

> str(wbr)
'data.frame':   214 obs. of  12 variables:
 $ countrycode      : Factor w/ 214 levels "ABW","ADO","AFG",..: 1 2 3 4 5 6 7 8 9 10 ...
     $ countryname      : Factor w/ 214 levels "Afghanistan",..: 10 5 1 6 2 202 8 9 4 7 ...
 $ gdp_per_capita   : num  19913 35628 415 2738 4091 ...
     $ literacy_female  : num  96.7 NA 17.6 59.1 95.7 ...
 $ literacy_male    : num  96.9 NA 45.4 82.5 98 ...
     $ literacy_all     : num  96.8 NA 31.7 70.6 96.8 ...
 $ infant_mortality : num  NA 2.2 70.2 101.6 13.3 ...
     $ illiteracy_female: num  3.28 NA 82.39 40.85 4.31 ...
 $ illiteracy_mele  : num  3.06 NA 54.58 17.53 1.99 ...
     $ illiteracy_male  : num  3.06 NA 54.58 17.53 1.99 ...
 $ illiteracy_all   : num  3.18 NA 68.26 29.42 3.15 ...

我想找到GDP最高的前50个国家illiteracy_all的平均值。

在你回答我之前,我需要告诉你数据框有NA个值,这意味着如果我想找到我必须写的意思:

mean(wbr$illiteracy_all, na.rm=TRUE)

对于可重现的例子,我们采取:

data.df <- data.frame(x=101:120, y=rep(c(1,2,3,NA), times=5))

那么我怎样才能平均y值,例如x的前5个值?

> data.df
     x  y
1  101  1
2  102  2
3  103  3
4  104 NA
5  105  1
6  106  2
7  107  3
8  108 NA
9  109  1
10 110  2
11 111  3
12 112 NA
13 113  1
14 114  2
15 115  3
16 116 NA
17 117  1
18 118  2
19 119  3
20 120 NA

1 个答案:

答案 0 :(得分:2)

以下任何一项都可行:

mean(data.df[rank(-data.df$x)<=5,"y"], na.rm=TRUE)

mean(data.df$y[rank(-data.df$x)<=5], na.rm=TRUE)

with(data.df, mean(y[rank(-x)<=5], na.rm=TRUE))

要解压缩原因,请先注意rank按照您预期的顺序排列等级,1最小数字的等级而不是最大:

> rank(data.df$x)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

我们可以绕过by negating the input

> rank(-data.df$x)
 [1] 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1

现在排名15是“前5名”。如果我们想要一个TRUEFALSE的向量来表示我们可以使用的前五名的位置:

> rank(-data.df$x)<=5
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[14] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

(实际上你可能会发现你的数据集中有一些联系。如果第50个位置被绑定,这只会导致问题。你可能想查看ties.method rank的参数。 1}}看看你想如何处理这个问题。)

因此,让我们在这些位置抓取y的值:

> data.df[rank(-data.df$x)<=5,"y"]
[1] NA  1  2  3 NA

或者您可以使用:

> data.df$y[rank(-data.df$x)<=5]
[1] NA  1  2  3 NA

现在我们知道要输入mean的内容:

> mean(data.df[rank(-data.df$x)<=5,"y"], na.rm=TRUE)
[1] 2

或者:

> mean(data.df$y[rank(-data.df$x)<=5], na.rm=TRUE)
[1] 2

或者,如果您不想重复数据框的名称,请使用with

> with(data.df, mean(y[rank(-x)<=5], na.rm=TRUE))
[1] 2