2017-10-07 1 views
1

r에 정통하지 않으므로 간단한 문제인지 여부를 모릅니다. 전체 합계의 60 % (또는 대략)를 구성하는 값의 합계를 기반으로 ID 범위를 만들려고합니다. 여기에 데이터 프레임이 있습니다. 내가 처음 ID로 DF를 정렬 한 후 확인 것이라고 DF범위의 합을 기준으로 ID 범위를 정하십시오.

ID  Val 
98  2 
98  1 
98  4 
3  11 
3  6 
3  8 
3  1 
24  3 
24  2 
46  1 
46  2 
59  6 

이러한 10 %, 10 %, 10 % 60 % 개까지 ID의 값의 합계의 어느 범위 및 그룹 그들과 나머지 그룹 그들을 위해 , 10 % (또는 무작위 10 %, 10 %, 20 % 또는 5 %, 15 %, 10 %, 10 %)가 될 수 있습니다. 이것이 가능 여부를 수 있다면 같은 내 dataframe이

ID  Val 
3-24 35   # (11+6+8+1+3+2) ~ 62% of the total sum of `Val` column 
46-59 9   # (1+2+6) = 18% of the total sum of `Val` column 
98  7   # (2+1+4) =14% of the total sum of `Val` column 

처럼 보일 것이라고 나는이

DF=DF[with(DF, order(DF$ID)), ] 
perce = round(sum(DF$ID)*60/100) 
for(i in 1:dim(DF)[1]){ 
    if(sum(DF$Val) == perce){ 
     ID=which(DF$ID) 
     . 
     . 
     . 
put those ID's in a range that constitutes 60% 

     } 
    } 

나도 몰라 시도 할 수 있습니다.?

감사 DOMNICK

+0

'DF $ Val == perce'에 대해 플로트를 테스트하는 것처럼 보입니다. 문제를 일으킬 수 있습니다. '? cut'도 도움이 될 수 있습니다 – cumin

+0

@cumin이 그것을 요약하고 'perce'를 반올림합니다 – Domnick

+0

정확히 무엇을 찾고 있는지 잘 모르겠지만 ['ntile' 함수] (https : // rdrr .io/cran/dplyr/man/ranking.html # heading-2)? – Aramis7d

답변

2

첫째, 우리는 데이터를 정렬하고 각 ID -group의 sum를 얻을.

그런 다음 cumsum(Val)을 사용하여 누계를 구할 수 있습니다. lag이 필요합니다. "이 행 앞에있는 모든 ID - 그룹 값의 합계"를 나타냅니다.

이제 cut을 사용하여 누적 합계를 간격 그룹 (-∞, 0.6 * total], (0.7 * total, 0.8 * total](0.8 * total, ∞)에 할당 할 수 있습니다.

그러면 우리는 이 될 수 있으며 sumVal이됩니다.

library('tidyverse') 

df <- tribble(
    ~ID, ~Val, 
    98, 2, 
    98, 1, 
    98, 4, 
    3, 11, 
    3, 6, 
    3, 8, 
    3, 1, 
    24, 3, 
    24, 2, 
    46, 1, 
    46, 2, 
    59, 6 
) 

breaks_proportions <- c(0.6, 0.1, 0.1) 
breaks_values <- cumsum(breaks_proportions) * sum(df$Val) 

df %>% 
    arrange(ID) %>% 
    group_by(ID) %>% 
    summarise(Val = sum(Val)) %>% 
    mutate(
    running_total = lag(cumsum(Val), default = 0), 
    group = cut(
     running_total, 
     c(-Inf, breaks_values, Inf))) %>% 
    group_by(group) %>% 
    summarise(
    ID = stringr::str_c(min(ID), '-', max(ID)), 
    Val = sum(Val)) %>% 
    select(ID, Val) 
# # A tibble: 4 x 2 
#  ID Val 
# <chr> <dbl> 
# 1 3-24 31 
# 2 46-46  3 
# 3 59-59  6 
# 4 98-98  7 
+0

'breaks_proportions'을 60 %, 10 %, 10 %로 취한 것으로 보입니다. 나머지 20 %는 다른 논리입니까? 당신이 설명 할 수 있다면. – Domnick

+0

어쨌든 코드가 작동 중입니다 ... 감사합니다 @Paul .. – Domnick

관련 문제