小编Kri*_*ian的帖子

清理R数据框,以便在列中没有行值大于下一行值的2倍

我有一个数据框,如下所示

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)

它将按我的要求清理.

我也尝试了不同的函数结构,并将其应用于数据框,但没有任何运气.

有没有一个很好的建议,如何重复数据框上的功能,直到它不再改变,更好的功能结构或更好的清洁方式?

任何建议都非常感谢

r data-manipulation dataframe data-cleaning

7
推荐指数
2
解决办法
827
查看次数

标签 统计

data-cleaning ×1

data-manipulation ×1

dataframe ×1

r ×1