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

我的问题是我不知道如何删除具有 alfa 代码的行,0001当列中这些代码的总和z超过等于 80 的值时,我想将这些行保存在一个新的数据框中,如下所示:

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

代码总和的0001值小于或等于 80。谢谢。

4

3 回答 3

1

您想使用cumsumof z、 byalfa和基于它的子集创建一个新列。有几种方法可以做到这一点,在我的脑海中,我可以举出两个:

这是一个data.table解决方案,使用bywith:=创建新列,并基于该列进行子集:

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 回答
0
df2 <- df[df$alfa == 0001, ]
df[-as.numeric(rownames(df2[!cumsum(df2$z) <= 80, ])), ]
于 2013-08-28T21:42:33.920 回答