我的数据框包含以下列:
> 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
答案 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
现在排名1
到5
是“前5名”。如果我们想要一个TRUE
和FALSE
的向量来表示我们可以使用的前五名的位置:
> 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