Это решение будет работать независимо от того, колонны цензора:
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
'Дат [cumsum (Дат $ цензор) <= 1,]' возможно при условии 'Дат 'всегда будет упорядочен, так как у вас есть – rawr
' df [seq (1, match (1, df $ censor)),] 'также. – thelatemail