1

次のような構造のデータベースがあります。

alfa beta gama z
0001  12a   1  10
0002  13q   1  100
0001  1a    1  70
0001  19p   2  30
0003   2a   2  10

0001私の問題は、列内のそれらのコードの合計が 80 に等しい値を超えたときにアルファ コードを持つ行を削除する方法がわからないことです。zこれらの行を次のような新しいデータ フレームに保存したいと思います。

alfa beta gama z
0001  12a   1  10
0002  13q   1  100
0001  1a    1  70
0003  2a   2  10

コードの合計が000180 以下の値を取得した場所。ありがとう。

4

3 に答える 3

1

cumsumof z、 by alfa、およびそれに基づくサブセットを使用して新しい列を作成します。これを行うにはいくつかの方法がありますが、思いついたのは次の 2 つです。

withを使用して新しい列を作成し、その列に基づいてサブセット化するソリューションはdata.table次のとおりです。by:=

library(data.table)
f <- data.table(f)
f[, cum.z := cumsum(z), by = alfa]
new.f <- f[!(alfa == 0001 & cum.z > 80)]

新しい変数を保持したくない場合は、

new.f[, cum.z := NULL]

で実装された同じものを次に示しますplyr

library(plyr)
f <- ddply(f, .(alfa), transform,
           cum.z = cumsum(z))
new.f <- f[!(f$alfa == 0001 & f$cum.z > 80),]

新しい列を削除するには、

new.f$cum.z <- NULL
于 2013-08-28T20:37:46.633 に答える
0

これを試すことができます:

#Setting the variables
alfa = c(0001, 0002, 0001, 0001, 0003)
beta = c('12a', '13q', '1a', '19q', '2a')
gama = c(1,1,1,2,2)
z = c(10,100,70,30,10)
f = data.frame(alfa,beta,gama,z)
#actual selection
tmp = f$z
tmp[f$alfa != 0001] = 0
zcum = cumsum(tmp)
index = f$alfa != 0001 | (f$alfa == 0001 & zcum<= 80)
new_frame = f[index,]
于 2013-08-28T20:09:41.840 に答える