删除特定差值下方的所有行

时间:2015-10-29 20:24:49

标签: r dataframe subset difference

我有一个带有变量时间,深度,最小值和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
....

我想做什么:

删除min和max之间差异的所有行(反之亦然)< 5.重要的是,只要差值> = 5(大于或等于5),就会保留min和max之间的所有行(标记为0)。

这是一个很大的数据框架,这只是一个摘录。但是最后提到它应该是这样的。

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()

1 个答案:

答案 0 :(得分:0)

你的描述和目标并不十分清楚,所以我做了一些假设...... 我正确理解你的目标 1A。您提供的示例输入和所需输出完全符合您的目标 1B。更具体地说,如果{ "students": [ { "courseId": "303431573", "userId": "104377167089915657872", "profile": { "id": "104377167089915657872", "name": { "givenName": "student2", "familyName": "User", "fullName": "student2 User" }, "emailAddress": "student2_rvnqrmpxeraft-mcygui@classroom-dev.com", "photoUrl": "https://lh3.googleusercontent.com/-XdUIqdMkCWA/AAAAAAAAAAI/AAAAAAAAAAA/4252rscbv5M/photo.jpg" } }, { "courseId": "303431573", "userId": "104304056850029354748", "profile": { "id": "104304056850029354748", "name": { "givenName": "student1", "familyName": "User", "fullName": "student1 User" }, *"emailAddress": "student1_kb5ysml_yw4l2ecbu581@classroom-dev.com", "photoUrl": "https://lh3.googleusercontent.com/-XdUIqdMkCWA/AAAAAAAAAAI/AAAAAAAAAAA/4252rscbv5M/photo.jpg"* } } ] } 与任何max之间的行数相同,您希望将max出现的每一行移至min的下一次出现。小于5。 2.每个max都有一个min 3.它们总是以相同的顺序出现

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

max

要将代码中断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,] minInd,您的数据中会出现maxIndmin

max告诉我们min和max之间的差异小于5,即前向关系。后向关系由which( (minInd - maxInd) < 5 )

捕获

这两个函数给出了我们比较的索引向量之间的差异,即数据的哪些变量集表现出不希望的行为。我们在此序列上调用which( (maxInd[-1] - minInd[-length(minInd)]) < 5 )来创建要从数据框lapply中删除的行序列。

由于df返回一个我们想要合并到一个长向量中的序列列表。我们执行lapply,这实际上意味着do.call(c,resultFromLAPPLY)。这些向量映射保存为两个变量c(list[[1]], ... ,list[[length(list)]])maxToMin。最后,我们将它们组合成一个向量minToMax

回想一下,final包含我们希望从final中移除的行的行数,因此我们使用df保存所需的结果

编辑:为代码引入了一些换行符以便于阅读。