2013-08-28 31 views
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阿爾法代碼時,這些碼在z列總和超過等於80的值,並且我想這些行中像這樣的新的數據幀保存行:

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

在哪裏的總和0001代碼的值小於或等於t 80.謝謝。

+0

您已接受的答案,所以我會剛落,在這裏:'子集(F,阿爾法= 「0001」 |! alfa ==「0001」&cumsum(z *(alfa ==「0001」))<= 80)'。 – flodel

回答

1

你想使一個新列的zcumsum,通過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 
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,] 
+0

感謝@pabaldonedo,但是這對於矢量和數據框架來說都很好,我可能會丟失數據! – Duck

0
df2 <- df[df$alfa == 0001, ] 
df[-as.numeric(rownames(df2[!cumsum(df2$z) <= 80, ])), ] 
相關問題