如果值低于 -50,则删除顶部和底部的整行

Delete top and bottom entire rows if value is lower than -50

我有以下数据集:

Profit MRO 15x5 D30
0.00 -9.189 -0.24
.50 -6.076 -0.248
-5.00 -7.699 -0.282
-2.50 -8.008 -0.281
-5.00 -0.183 -0.056
-5.00 -0.235 -0.061
5.00 0.141 -0.027
-5.00 -4.062 -0.103
-2.50 -5.654 -0.258
-2.50 -1.578 -0.051
-5.00 -3.336 -0.205
-2.50 -1.523 -0.022
2.50 -1.524 -0.194
7.50 -1.049 -0.055
0.00 -1.043 -0.059

我想先按升序排列 D30 列,然后查看 Profit 列。如果“利润”列中前 n 行和后 n 行值(单元格范围)小于 -50,则删除数据集中的整行。

结果是这样的:

Profit MRO 15x5 D30
5.00 0.141 -0.027
-2.50 -1.578 -0.051
7.50 -1.049 -0.055
-5.00 -0.183 -0.056
0.00 -1.043 -0.059
-5.00 -0.235 -0.061
-5.00 -4.062 -0.103
2.50 -1.524 -0.194
-5.00 -3.336 -0.205
0.00 -9.189 -0.24
.50 -6.076 -0.248

此输出是从整个数据集中删除前 1 行和后 3 行的结果,因为这些行(值范围)的利润值小于 -50。

谁能帮我在 R 程序中使用 dplyr 或使用其他一些过滤包来做到这一点?

感谢您的支持。

此致, 法汉

使用cumany。结合 filter,它会删除行,直到满足条件(此处为 Profit <= -50)。

第一个命令是一种将 Profit 列解析为数字列的方法。

library(dplyr)

data %>% mutate(Profit = parse_number(str_replace(Profit,"^-\$(.*)$", "$-\1"))) %>% 
  arrange(D30) %>% 
  filter(cumany(Profit > -50)) %>% 
  arrange(desc(D30)) %>% 
  filter(cumany(Profit > -50))


   Profit MRO_15x5    D30
1   275.0    0.141 -0.027
2  -162.5   -1.578 -0.051
3   337.5   -1.049 -0.055
4  -175.0   -0.183 -0.056
5   100.0   -1.043 -0.059
6  -175.0   -0.235 -0.061
7  -175.0   -4.062 -0.103
8   412.5   -1.524 -0.194
9  -175.0   -3.336 -0.205
10  150.0   -9.189 -0.240
11   12.5   -6.076 -0.248