我有一个数据库,其结构如下:
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的值时,我不知道如何删除alfa代码为z
的行,并且我想将这些行保存在新的数据框中,如下所示:
alfa beta gama z
0001 12a 1 10
0002 13q 1 100
0001 1a 1 70
0003 2a 2 10
0001
代码之和的值小于或等于80.谢谢。
答案 0 :(得分:1)
您希望使用cumsum
z
创建一个新列,alfa
,然后根据该列进行分组。有几种方法可以做到这一点,在我的头脑中,我可以说出两个:
以下是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
答案 1 :(得分: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,]
答案 2 :(得分:0)
df2 <- df[df$alfa == 0001, ]
df[-as.numeric(rownames(df2[!cumsum(df2$z) <= 80, ])), ]