2016-09-28 9 views
0

マイデータフレームは次のようになります。サブセット内のグループに基づいたデータフレーム分位

df 
city year wealth 
a  2001 1 
a  2002 30 
b  2001 2 
b  2002 20 
c  2001 3 
c  2002 10 

私は、各年以内の都市に都市の富の相対に基づいてデータフレームをサブセットに簡単な方法を探しています。だから私は、このような出力のために行くよ:

top_third 
city year wealth 
a  2002 30 
c  2001 3 

mid_third 
city year wealth 
b  2001 2 
b  2002 20 

low_third 
city year wealth 
c  2002 10 
a  2001 1 

私はこのようなルックスをしようとしてきたアプローチ:

top_third <- subset(df, wealth > quantile(wealth, 0.66, na.rm = TRUE)) 
non_rich <- subset(df, wealth <=quantile(wealth, 0.66, na.rm = TRUE)) 
mid_third <- subset(non_rich, wealth > quantile(wealth, 0.5, na.rm = TRUE)) 
low_third <- subset(non_rich, wealth <=quantile(wealth, 0.5, na.rm = TRUE)) 

このアプローチの私がいる最大の問題は、私ができることです毎年以内に分位数を計算する方法を見つけることはできません。誰もがこれを行う簡単な方法を知っていますか?

+0

は、あなたが何を取得し、このヘルプをいあなたは欲しいですか? 'df'をdata.table(' setDT(df) ')として扱うには、data.tableパッケージ(' library(data.table) ')を使います。あなたは 'df [、rank:= rank(wealth)/ length(wealth)、by =" year "]'を実行することによって、富のランクを年ごとに定義します。最後に、ランクに基づいて結果を分割します。 'split(df [、!"ランク "、with = F]、df $ rank)' – jav

答えて

1

dplyrパッケージを使用するアプローチは次のとおりです。年によって当社グループのデータを、そして私たちは、その後、split新しいグループ列でデータセットアップできる都市はである(その分位)グループを示す新しい列を作成します。

library(dplyr) 
df <- df %>% group_by(year) %>% 
    mutate(group = cut(wealth, c(-Inf, quantile(wealth, c(1/3, 2/3)), Inf), 
        labels = 1:3)) 
split(df, df$group) 
# $`1` 
# Source: local data frame [2 x 4] 
# Groups: year [2] 

#  city year wealth group 
# <fctr> <int> <int> <fctr> 
# 1  a 2001  1  1 
# 2  c 2002  10  1 

# $`2` 
# Source: local data frame [2 x 4] 
# Groups: year [2] 

#  city year wealth group 
# <fctr> <int> <int> <fctr> 
# 1  b 2001  2  2 
# 2  b 2002  20  2 

# $`3` 
# Source: local data frame [2 x 4] 
# Groups: year [2] 

#  city year wealth group 
# <fctr> <int> <int> <fctr> 
# 1  a 2002  30  3 
# 2  c 2001  3  3 
関連する問題