我有一个数据框,如下所示
dist <- c(1.1,1.0,10.0,5.0,2.1,12.2,3.3,3.4)
id <- rep("A",length(dist))
df<-cbind.data.frame(id,dist)
df
id dist
1 A 1.1
2 A 1.0
3 A 10.0
4 A 5.0
5 A 2.1
6 A 12.2
7 A 3.3
8 A 3.4
Run Code Online (Sandbox Code Playgroud)
我需要清理它,因此dist列中的行值在任何时候都不会大于下一行值的2倍.清理后的数据框如下所示:
id dist
1 A 1.1
2 A 1.0
5 A 2.1
7 A 3.3
8 A 3.4
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用for循环和if语句来清理它
cleaner <- function (df,dist,times_larger) {
for (i in 1:(nrow(df)-1)) {
if (df$dist[i] > df$dist[i+1]*times_larger){
df<-df[-i,]
break
}
}
df
}
Run Code Online (Sandbox Code Playgroud)
显然,如果我不打破循环,它将产生错误,因为df中的行数将在此过程中发生变化.如果我在df上手动运行循环几次:
df<-cleaner(df,"dist",2)
Run Code Online (Sandbox Code Playgroud)
它将按我的要求清理.
我也尝试了不同的函数结构,并将其应用于数据框,但没有任何运气.
有没有一个很好的建议,如何重复数据框上的功能,直到它不再改变,更好的功能结构或更好的清洁方式?
任何建议都非常感谢