2015-03-30 2 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

'Дат [cumsum (Дат $ цензор) <= 1,]' возможно при условии 'Дат 'всегда будет упорядочен, так как у вас есть – rawr

+0

' df [seq (1, match (1, df $ censor)),] 'также. – thelatemail

ответ

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']),] 
Смежные вопросы