删除特定差异值以下的所有行
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,]
分解代码 minInd
和 maxInd
是 min
和 max
在您的数据中出现的索引。
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)]])
。这些向量被映射保存为两个变量 maxToMin
和 minToMax
。最后我们将它们组合成一个向量 final
.
回想一下 final
包含我们希望从 df
中删除的行索引,因此我们用 newDf = df[-final,]
保存我们想要的结果
编辑:为代码引入了一些换行符以提高可读性。
我有一个带有时间、深度、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,]
分解代码 minInd
和 maxInd
是 min
和 max
在您的数据中出现的索引。
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)]])
。这些向量被映射保存为两个变量 maxToMin
和 minToMax
。最后我们将它们组合成一个向量 final
.
回想一下 final
包含我们希望从 df
中删除的行索引,因此我们用 newDf = df[-final,]
编辑:为代码引入了一些换行符以提高可读性。