-1

私はこのようなデータフレームを持っています

set.seed(500)
df=data.frame(group=c(rep("A",20),rep("B",20),rep("C",20),rep("D",20)),value=round(runif(80,min=1,max=100)))

グループごとに、合計が目標値を超える/満たすまで、上位の値の行を取得したい

target=data.frame(group=c("A","B","C","D"),value=c(1000,400,500,300))

新しいグループを 4 つのデータ フレームとして出力します。

大きいものから順に並べてみました

df=df[with(df, order(group,-value)), ]

望ましい出力は

group value
a    98
a    93
...
a  (sum from 98 to here, the group a subtotal should exceed 1000)
b  93
...
c   99

これを行う最善の方法は何ですか?

ありがとう。

4

3 に答える 3

1

これにより、データフレーム内のアイテムが分割および制限されます。次のワンライナーは、最後の行を選択します。

> lapply( split(df, df[[1]] ) , function(d) d[ cumsum( d[[2]]) < 200 , ] )
$A
  group value
1     A    84
2     A    73

$B
   group value
21     B     9
22     B    81
23     B     5
24     B    54
25     B    28

$C
   group value
41     C    20
42     C    43
43     C    84
44     C    49

$D
   group value
61     D     4
62     D    77
63     D    85

次に使用しますtail

> lapply( split(df, df[[1]] ) , function(d) tail( d[ cumsum( d[[2]]) < 200 , ] ,1))
$A
  group value
2     A    73

$B
   group value
25     B    28

$C
   group value
44     C    49

$D
   group value
63     D    85

「最大値」を選択する場合は、合計を行う前にデータフレームを並べ替えます。

> lapply( split(df[order(df[[2]], decreasing=TRUE), ] , df[[1]] ) , function(d) tail( d[ cumsum( d[[2]]) < 200 , ] ,1))
$A
  group value
3     A    98

$B
   group value
62     D    77

$C
   group value
71     D    34

$D
   group value
74     D     2
于 2014-09-14T04:45:55.917 に答える