2017-10-02 1 views
3

어떤 레벨이 가장 높은지 확인하는 질문이 있습니다. 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)이 있습니다 :

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 

내가 원하는 것은 :
여기 내 데이터입니다.
V2에는 5 개의 레벨이 있으며, 0.25 * V1입니다.
V3에는 6 단계가 있습니다.
내가 원하는 결과는 YearArea 인 그룹입니다. 또한 V1은 최대 레벨 수입니다. 예를 들어, Year == 2014Area == USA에있는 경우 V1에는 레벨 1, 레벨 3, 레벨 1, 레벨 300이 각각 1 개씩 있습니다. 따라서 결과가 가장 많으므로 200이되어야합니다. V2V3은 동일합니다.

아이디어가 있으십니까?

데이터

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 기능을 얻을 수 있습니다. '년', '지역'으로 그룹화

library(data.table) 
Mode <- function(x) { 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 

은을 가진 소자를 얻을 data.table (.SD)들의 서브 세트를 통해 루프 (이 fread로 읽을 이미 data.table 같이 data.table 구문을 사용) 가장 높은 빈도는 Mode을 사용하고, 마찬가지로 table을 사용하여 열의 빈도를 얻고 sum을 찾고 각 열 (pmax)의 최대 값을 취하여 'Mode'열의 list을 연결하여 여러 열을 단일 열로 접습니다.

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'이 더 빨라야합니다. –