2017-10-02 6 views
3

どのレベルが最も高いかを確認する質問があります。ここ
は私のデータである:私が欲しいものグループ単位でレベルを集計してください

Year Area V1 V2 V3 
2014 USA 100 25 50 
2014 USA 200 50 60 
2014 USA 200 50 50 
2014 USA 200 50 50 
2014 USA 300 75 40 
2014 ASIA 100 25 60 
2014 ASIA 100 25 70 
2014 ASIA 300 75 60 
2014 ASIA 400 100 60 
2014 ASIA 500 125 70 
2015 USA 100 25 80 
2015 USA 300 75 80 
2015 USA 300 75 70 
2015 USA 300 75 90 
2015 USA 500 125 40 
2015 ASIA 400 100 90 
2015 ASIA 400 100 80 
2015 ASIA 300 75 80 
2016 USA 500 125 60 
2016 USA 500 125 60 
2016 ASIA 100 25 50 

がある:V1

Year Area V1 V2 V3 Count 
2014 USA 200 50 50 5 
2015 USA 300 75 80 5 
2016 USA 500 125 60 2 
2014 ASIA 100 25 60 5 
2015 ASIA 400 100 80 3 
2016 ASIA 100 25 50 1 

、5つの段階(100、200、300、400、および500)があります。
V2には、5つのレベルがあり、0.25 * V1です。
V3には、6つのレベルがあります。
私が望む結果は、グループYearAreaです。さらに、V1はレベルの最大カウントです。たとえば、Year == 2014Area == USAの場合、V1には1レベル100,3レベル200,1レベル300が含まれているため、結果は200になります。 V2V3は同じです。

DATA

dt <- fread("Year Area V1 V2 V3 
2014 USA 100 25 50 
2014 USA 200 50 60 
2014 USA 200 50 50 
2014 USA 200 50 50 
2014 USA 300 75 40 
2014 ASIA 100 25 60 
2014 ASIA 100 25 70 
2014 ASIA 300 75 60 
2014 ASIA 400 100 60 
2014 ASIA 500 125 70 
2015 USA 100 25 80 
2015 USA 300 75 80 
2015 USA 300 75 70 
2015 USA 300 75 90 
2015 USA 500 125 40 
2015 ASIA 400 100 90 
2015 ASIA 400 100 80 
2015 ASIA 300 75 80 
2016 USA 500 125 60 
2016 USA 500 125 60 
2016 ASIA 100 25 50") 
+0

特にV2とV3の場合は! V1のモードをYear/Area内にのみ保持すると、それらが削除されないのはなぜですか? –

答えて

2

我々は@KenWilliam's answer hereからMode機能を得ることができます。

(それはすでに data.tableあるよう freadで読んでから data.table構文を使用して)「年」、「エリア」によってグループ化された
library(data.table) 
Mode <- function(x) { 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 

、data.tableのサブセット(.SD)ループスルー、持っている要素を取得(pmax)を連結して、listの列の 'Mode'を連結して、複数の列を1つに崩壊させてください(pmax)。Modeを使用して最高頻度を計算し、tableを使用して列の頻度を取得し、sum

dt[, c(lapply(.SD, Mode), 
    Count = do.call(pmax, lapply(.SD, function(x) sum(table(x))))), by = .(Year, Area)] 
# Year Area V1 V2 V3 Count 
#1: 2014 USA 200 50 50  5 
#2: 2014 ASIA 100 25 60  5 
#3: 2015 USA 300 75 80  5 
#4: 2015 ASIA 400 100 80  3 
#5: 2016 USA 500 125 60  2 
#6: 2016 ASIA 100 25 50  1 
我々はできる dplyrを使用し
+0

私のデータに他の列がある場合、そのコードにはデータが含まれています。名前、年齢などの他の列を考慮せずにどのように処理できますか。 –

+1

@PeterChenその場合は、 '.SDcols'の列を – akrun

2

dt2 
# A tibble: 6 x 7 
    Year Area V1 V2 V3 Count Count_V1 
<int> <fctr> <int> <int> <int> <int> <int> 
1 2014 ASIA 100 25 60  5  2 
2 2015 ASIA 400 100 90  3  2 
3 2016 ASIA 100 25 50  1  1 
4 2014 USA 200 50 60  5  3 
5 2015 USA 300 75 80  5  3 
6 2016 USA 500 125 60  2  2 

しかし、コメントで述べたように、彼らは明確な判断基準に基づいていないことから、V2とV3の値が混乱している。その結果

dt %>% 
    # we count the number of item within Year x Area groups 
    group_by(Year, Area) %>% 
    mutate(Count=n()) %>% 
    # now we count the number of V1 levels within the Year x Area groups 
    group_by(Year, Area, V1) %>% 
    mutate(Count_V1=n()) %>% 
    arrange(desc(Count_V1)) %>% 
    # now we come back to Year x Area grouping and retain the most abundant entry 
    group_by(Year, Area) %>% 
    slice(1) %>% 
    ungroup() %>% 
    # cosmetics 
    arrange(Area, Year) -> dt2 

。私が理解しているところから、それらは取り除くことができます。Count_V1

dt2 %>% select(-Count_V1, -V2, -V3) 

# A tibble: 6 x 4 
    Year Area V1 Count 
<int> <fctr> <int> <int> 
1 2014 ASIA 100  5 
2 2015 ASIA 400  3 
3 2016 ASIA 100  1 
4 2014 USA 200  5 
5 2015 USA 300  5 
6 2016 USA 500  2 
+0

に指定してください。しかし、実際には 'V2'と' V3'を削除する必要はありません。私もそれらが必要です。これは 'dplyr'ソリューションです。しかし、私のデータが非常に大きい場合、 'data.table'はより速くなければなりません。 –

関連する問題