2016-05-06 16 views
2

売上と年度に基づいて、下のデータセットに「カテゴリ」列を作成します。R:dplyrで上位、中位、下位の値を検索してカテゴリ列を作成

set.seed(30) 

df <- data.frame(
    Year = rep(2010:2015, each = 6), 
    Country = rep(c('India', 'China', 'Japan', 'USA', 'Germany', 'Russia'), 6), 
    Sales = round(runif(18, 100, 900)) 
) 

head(df) 

    Year Country Sales 
1 2010 India 661 
2 2010 China 888 
3 2010 Japan 285 
4 2010  USA 272 
5 2010 Germany 332 
6 2010 Russia 660 

カテゴリーは以下のとおりです。カテゴリ - 各年度における最低の売上高は1つの

ボトム2つの国:各年における最高の売上と

トップ2国カテゴリー - 3

残りの国:カテゴリ - 2

データセットは次のようになります期待:

Year Country Sales Category 
1 2010 India 661  1 
2 2010 China 888  1 
3 2010 Japan 285  3 
4 2010  USA 272  3 
5 2010 Germany 332  2 
6 2010 Russia 660  2 

答えて

2

ここではあまり必要ありません。ただgroup_by年、arrange最大から最小販売まで、次に2で写すことmutateに新しい列を追加します。

df %>% group_by(Year) %>% 
    arrange(desc(Sales)) %>% 
    mutate(Category = c(1, 1, rep(2, n()-4), 3, 3)) 

# Source: local data frame [36 x 4] 
# Groups: Year [6] 
# 
#  Year Country Sales Category 
# (int) (fctr) (dbl) (dbl) 
# 1 2010 China 491  1 
# 2 2010  USA 436  1 
# 3 2010 Japan 391  2 
# 4 2010 Germany 341  2 
# 5 2010 Russia 218  3 
# 6 2010 India 179  3 
# 7 2011 Japan 873  1 
# 8 2011 India 819  1 
# 9 2011 Russia 418  2 
# 10 2011 China 279  2 
# .. ...  ... ...  ... 

それはより少ない4カ国で失敗しますが、それはからの問題のような音はありません質問。

1

私たちは、「年」でグループ化した後、「カテゴリ列を作成するためにcutを使用することができます。

library(dplyr) 
df %>% 
    group_by(Year) %>% 
    mutate(Category = as.numeric(cut(-Sales, breaks=c(-Inf, 
     quantile(-Sales, prob = c(0, .5, 1)))))) 

それともdata.table

library(data.table) 
setDT(df)[order(-Sales), Category := if(.N > 4) rep(1:3, 
    c(2, .N - 4, 2)) else rep(seq(.N), each = ceiling(.N/3)) ,by = Year] 

を使用して、各 "年" の4よりも少ない要素がある場合にも動作するはずです。つまり、2010年の最初の5回の観測を削除した場合です。

df1 <- df[-(1:5),] 
setDT(df1)[order(-Sales), Category := if(.N > 4) rep(1:3, 
     c(2, .N - 4, 2)) else rep(seq(.N), each = ceiling(.N/3)) ,by = Year] 
head(df1) 
# Year Country Sales Category 
#1: 2010 Russia 218  1 
#2: 2011 India 819  1 
#3: 2011 China 279  2 
#4: 2011 Japan 873  1 
#5: 2011  USA 213  3 
#6: 2011 Germany 152  3 
+0

@ abhy3投稿を更新しました。チェックしてください。 – akrun

+1

ありがとう@akrun。 data.tableのソリューションはよく見えます。 – abhy3

関連する問題