2017-10-07 10 views
1

rに精通していないので、これが単純な問題かどうかは分かりません。 総額の60%(または約)を構成する値の合計に基づいてIDの範囲を作成したいとします。ここにデータフレームがあります。 DFIDの範囲をRの値の合計に基づいて作成する

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 

私は最初にそれらをIDによってDFをソートした後、60%の点で最大IDの値和のどの範囲を確認し、基になるように、残りのために、10%、10%、10%グループ、それらを、10%(またはランダム10%、10%、20%または5%、15%、10%、10%)であってもよい。そのような私のデータフレームが

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 - 基のsumを取得します。

次に、合計を取得するにはcumsum(Val)を使用できます。 lagこれは "ID - この行の前のグループの値すべての合計"を表します。

(-∞, 0.6 * total],(0.7 * total, 0.8 * total]および(0.8 * total, ∞)の累積合計をcutに割り当てることができます。

この場合、group_byとなり、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

とにかくあなたのコードは私のために働いています...ありがとう@ポール.. – Domnick

関連する問題