2015-03-30 87 views
1
State Year APPT mood ranney_4yrs folded_ranney_4yrs time censor 
Arizona 1970 3 47.778 0.3299708   0.8299708 30  0 
Arizona 1971 3 51.948 0.3265375   0.8265375 31  0 
Arizona 1972 3 48.429 0.3246062   0.8246062 32  0 
Arizona 1973 3 42.909 0.3226750   0.8226750 33  0 
Arizona 1974 1 40.548 0.3683167   0.8683167 34  1 
Arizona 1975 1 39.517 0.4139583   0.9139583 35  1 
Arizona 1976 1 38.659 0.4543917   0.9543917 36  1 
Arizona 1977 1 36.995 0.4948250   0.9948250 37  1 

我有這個數據幀,我想除去在審查列中的第一個1的第一個實例。我可以編寫什麼樣的代碼來保留第一個實例並刪除審查員列中1的所有後續實例?刪除數據框中的一行有條件的前一行

+0

'DAT [cumsum(DAT $檢查員)<= 1,]'也許假設'DAT '將永遠被訂購,因爲你有 – rawr 2015-03-30 22:02:02

+0

'df [seq(1,match(1,df $ censor)),]''也是。 – thelatemail 2015-03-30 22:38:42

回答

0

該解決方案將無論工作御史列的順序:

df[df$censor!=1 | ave(df$censor,df$censor,FUN=function(x) 1:length(x))==1,]; 

它的工作原理導出每個不同審查值的「運行計數」。我以相當不尋常的方式使用了ave()函數來爲每個唯一傳感器值評估表達式1:length(x)一次,並且ave()函數執行必要的工作以將每個得到的「計數向量」映射回傳感器值在分組向量(即第二個參數爲ave())。 ave()的第一個參數的內容(但不是長度)完全不相關,因爲表達式1:length(x)僅取決於組的長度,而不取決於其內容。 (但爲第一個參數重用分組向量是有意義的,因爲它保證具有正確的長度,即與分組向量長度相同。)因此,返回值ave()表示每個傳感器值的運行計數,根據他們在審查專欄中發生的順序妥善訂購。運行計數然後可用於索引操作以僅選擇先發生的行,即具有運行計數值1的行(至少對於檢查值1; |的LHS在所有其他傳感器值中選擇而不管發生數)。

這裏的一個示範,其中我已經與檢查員柱弄亂略微證明階不可知論:

df <- data.frame(State=c('Arizona','Arizona','Arizona','Arizona','Arizona','Arizona','Arizona','Arizona'), Year=c(1970,1971,1972,1973,1974,1975,1976,1977), APPT=c(3,3,3,3,1,1,1,1), mood=c(47.778,51.948,48.429,42.909,40.548,39.517,38.659,36.995), ranney_4yrs=c(0.3299708,0.3265375,0.3246062,0.3226750,0.3683167,0.4139583,0.4543917,0.4948250), folded_ranney_4yrs=c(0.8299708,0.8265375,0.8246062,0.8226750,0.8683167,0.9139583,0.9543917,0.9948250), time=c(30,31,32,33,34,35,36,37), censor=c(1,0,1,0,0,1,0,1)); 
df; 
##  State Year APPT mood ranney_4yrs folded_ranney_4yrs time censor 
## 1 Arizona 1970 3 47.778 0.3299708   0.8299708 30  1 
## 2 Arizona 1971 3 51.948 0.3265375   0.8265375 31  0 
## 3 Arizona 1972 3 48.429 0.3246062   0.8246062 32  1 
## 4 Arizona 1973 3 42.909 0.3226750   0.8226750 33  0 
## 5 Arizona 1974 1 40.548 0.3683167   0.8683167 34  0 
## 6 Arizona 1975 1 39.517 0.4139583   0.9139583 35  1 
## 7 Arizona 1976 1 38.659 0.4543917   0.9543917 36  0 
## 8 Arizona 1977 1 36.995 0.4948250   0.9948250 37  1 
df[df$censor!=1 | ave(df$censor,df$censor,FUN=function(x) 1:length(x))==1,]; 
##  State Year APPT mood ranney_4yrs folded_ranney_4yrs time censor 
## 1 Arizona 1970 3 47.778 0.3299708   0.8299708 30  1 
## 2 Arizona 1971 3 51.948 0.3265375   0.8265375 31  0 
## 4 Arizona 1973 3 42.909 0.3226750   0.8226750 33  0 
## 5 Arizona 1974 1 40.548 0.3683167   0.8683167 34  0 
## 7 Arizona 1976 1 38.659 0.4543917   0.9543917 36  0 
0

這將做到這一點,如果數據幀由御史列排序:​​

df[df[,'censor']!=1 | !duplicated(df[,'censor']),] 
相關問題