根据前一行删除数据框中的一行
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
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