删除特定差异值以下的所有行

Delete all rows below a specific differential value

我有一个带有时间、深度、minmax 和 chla 变量的数据帧 df:

   datetime          depth    minmax   chla
2014-07-19 07:22:27  15.04    max      7.142671
2014-07-19 07:22:28  15.03     0       6.265014
2014-07-19 07:22:29  15.02     0       7.184299
2014-07-19 07:22:30  15.00     0       6.313580
2014-07-19 07:22:31  14.98     0       6.695170
2014-07-19 07:22:32  14.96     0       5.748133
2014-07-19 07:22:33  14.96    min      6.431526
2014-07-19 07:22:34  14.99     0       6.362146
2014-07-19 07:22:35  14.99     0       7.114919
2014-07-19 07:22:36  14.93    max      7.628331
2014-07-19 07:22:37  14.71     0       5.848734
2014-07-19 07:22:38  14.42     0       6.382960
2014-07-19 07:22:39  13.97     0       8.516395
2014-07-19 07:22:40  13.50     0       6.518251
2014-07-19 07:22:40  12.90     0       6.549472
2014-07-19 07:22:42  12.36     0       5.425516
2014-07-19 07:22:43  11.82     0       5.095961
2014-07-19 07:22:44  11.23     0       5.272880
2014-07-19 07:22:45  10.68     0       5.210438
2014-07-19 07:22:46  10.01     0       4.804565
2014-07-19 07:22:47   9.38     0       5.123713
2014-07-19 07:22:48   8.76     0       3.923439
2014-07-19 07:22:49   8.02     0       3.566132
2014-07-19 07:22:50   7.37     0       2.657254
2014-07-19 07:22:51   6.65     0       2.664192
2014-07-19 07:22:52   6.04     0       2.671130
2014-07-19 07:22:52   5.48     0       2.674599
2014-07-19 07:22:53   4.84     0       2.681537
2014-07-19 07:22:54   4.36     0       1.817756
2014-07-19 07:22:55   3.94     0       1.828163
2014-07-19 07:22:56   3.76     0       1.796942
2014-07-19 07:22:57   3.73     0       1.557581
2014-07-19 07:22:58   3.87    min      2.018958
2014-07-19 07:22:59   4.14     0       2.143842
2014-07-19 07:23:00   4.53     0       1.481263
....

我想做的事情:

删除最小值和最大值之间的差异(反之亦然)< 5 的所有行。重要的是,一旦差异 >= 5,最小值和最大值之间的所有行(标记为 0)将被保留(大于或等于 5)。

这是一个大数据框,这只是一个摘录。不过最后参考上面应该是这样的。

datetime              depth   minmax  chla
2014-07-19 07:22:36   14.93   max     7.628331
2014-07-19 07:22:37   14.71     0     5.848734
2014-07-19 07:22:38   14.42     0     6.382960
2014-07-19 07:22:39   13.97     0     8.516395
2014-07-19 07:22:40   13.50     0     6.518251
2014-07-19 07:22:40   12.90     0     6.549472
2014-07-19 07:22:42   12.36     0     5.425516
2014-07-19 07:22:43   11.82     0     5.095961
2014-07-19 07:22:44   11.23     0     5.272880
2014-07-19 07:22:45   10.68     0     5.210438
2014-07-19 07:22:46   10.01     0     4.804565
2014-07-19 07:22:47    9.38     0     5.123713
2014-07-19 07:22:48    8.76     0     3.923439
2014-07-19 07:22:49    8.02     0     3.566132
2014-07-19 07:22:50    7.37     0     2.657254
2014-07-19 07:22:51    6.65     0     2.664192
2014-07-19 07:22:52    6.04     0     2.671130
2014-07-19 07:22:52    5.48     0     2.674599
2014-07-19 07:22:53    4.84     0     2.681537
2014-07-19 07:22:54    4.36     0     1.817756
2014-07-19 07:22:55    3.94     0     1.828163
2014-07-19 07:22:56    3.76     0     1.796942
2014-07-19 07:22:57    3.73     0     1.557581
2014-07-19 07:22:58    3.87    min    2.018958
2014-07-19 07:22:59    4.14     0     2.143842
2014-07-19 07:23:00    4.53     0     1.481263 
...

直到知道我试过了 subset(), abs()

您的描述和 objective 的意思并不完全清楚,所以我做了一些假设... 1. 我正确理解你的 objective 1a.您提供的示例输入和所需输出完全符合您的目标 1b.更具体地说,您希望删除从出现 max 到下一次出现 max 的每一行,前提是任何 min 和任何 max 之间的行数小于 5。 2. 每个max对应一个min 3.它们总是以相同的顺序出现

根据这些假设,以下代码会产生所需的结果。

minInd = which(df$minmax == 'min')
maxInd = which(df$minmax == 'max')

minToMax = do.call(c,
                    lapply(
                        which( (maxInd[-1] - minInd[-length(minInd)]) < 5 ), 
                        function(x) { 
                            seq(maxInd[x],(maxInd[x+1]-1)) 
                        }   
                    )
                )
maxToMin = do.call(c,
                    lapply(
                        which( (minInd - maxInd) < 5 ), 
                        function(x) { 
                            seq(maxInd[x],(maxInd[x+1]-1)) 
                        }
                    )
                )


final = c(maxToMin,minToMax)

newDf = df[-final,]

分解代码 minIndmaxIndminmax 在您的数据中出现的索引。

which( (minInd - maxInd) < 5 )告诉我们min和max之差小于5的地方,就是正向关系。后向关系由 which( (maxInd[-1] - minInd[-length(minInd)]) < 5 )

捕获

这两个函数为我们提供了我们比较的索引向量中的索引,即您的数据的哪些索引集表现出不良行为。我们在此序列上调用 lapply 以创建要从数据帧 df.

中删除的行的序列

因为 lapply returns 我们想要折叠成一个长向量的序列列表。我们执行 do.call(c,resultFromLAPPLY),这实际上意味着 c(list[[1]], ... ,list[[length(list)]])。这些向量被映射保存为两个变量 maxToMinminToMax。最后我们将它们组合成一个向量 final.

回想一下 final 包含我们希望从 df 中删除的行索引,因此我们用 newDf = df[-final,]

保存我们想要的结果

编辑:为代码引入了一些换行符以提高可读性。