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

标签 r dataframe data-manipulation data-cleaning

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

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

我需要清理它,以便 dist 列中的行值不会更大
任何时候都大于下一行值的 2 倍。一个清理过的数据框看起来
像这样:
  id dist
1  A  1.1
2  A  1.0
5  A  2.1
7  A  3.3
8  A  3.4

我试过用 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
            }

显然,如果我不打破循环,它会产生一个错误,因为
df 中的行数将在此过程中发生变化。如果我手动运行循环
在 df 上多次:
df<-cleaner(df,"dist",2)

它会按照我的意愿清理。

我还尝试了不同的函数结构,并通过 apply 将其应用于数据框,但没有任何运气。

有没有人对如何在数据框上重复函数直到它不再改变、更好的函数结构或更好的清理方法有什么好的建议?

任何建议都非常感谢

最佳答案

您可以转移您的 dist左边第一列元素,乘以二,与原dist比较:

subset(df,dist < c(2*dist[-1],Inf))
#  id dist
#1  A  1.1
#2  A  1.0
#5  A  2.1
#7  A  3.3
#8  A  3.4

关于r - 清理 R 数据框,以便在列中没有行值大于下一行值的 2 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28220776/

相关文章:

r - 为多组按组生成选择切换矩阵

通过另一个向量中包含的字符串动态引用向量名称

r - 加入 2 个数据集并创建找到匹配项的新行

r - 在 R 中使用 GAM 调整 p 值?

python - 有没有更快的替代方法来获取 DataFrame 的子集?

python - 为什么数据帧 'df[column]' 的值不等于 'df[column].values' ? (df[x][0] != df[x][0].values)?

python - 如何从另一个数据帧为一个数据帧分配特定值?

SAS 为组的其余部分返回组中的第一个值

r - 设置 R 中生成 Delaunay 图的最大长度

r - 如何使用PCA对高度相关变量进行时间序列预测?