根据前一行删除数据框中的一行

Removing a row in a data frame conditional on the row previous

  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 的所有后续实例?

如果数据框按审查列排序,这将执行此操作:

df[df[,'censor']!=1 | !duplicated(df[,'censor']),]

无论检查器列的顺序如何,此解决方案都有效:

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

它通过推导每个不同审查值的 "running count" 来工作。我以一种相当不寻常的方式使用了 ave() 函数来为每个唯一的审查值评估表达式 1:length(x) 一次,并且 ave() 函数执行必要的工作来映射每个结果 "count vector" 回到分组向量中审查值出现的顺序(即 ave() 的第二个参数)。 ave() 的第一个参数的内容(但不是长度)是完全不相关的,因为表达式 1:length(x) 只取决于组的长度,而不是它的内容。 (但是对第一个参数重用分组向量是有意义的,因为它保证具有正确的长度,即与分组向量的长度相同。)因此,ave() 的 return 值表示每个删失值的 运行 计数,根据它们在删失列中出现的顺序正确排序。然后 运行 计数可以在索引操作中用于 select 只有最先出现的行,即 运行 计数值为 1 的行(至少对于审查值 1;LHS | select 在所有其他审查员值中的数量,无论出现次数如何)。

这是一个演示,其中我稍微弄乱了检查器列以演示顺序不可知论:

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