r-过滤数据帧以只保留比第一行越来越小的行



我有一个数据帧,它按abc列降序排序(需要保持这种方式(。因此,从第一行开始(即,其中ID为1259,value为4054(,我希望在value列中保留具有较低值的下一行,即第2行(即,value为3902(。然后,基于第2行(3902(中的值,我想要选择下一个最低值的行(即,第4行中的3801(。然后,基于第4行(3801(中的值,我将选择下一个值最低的行(即value为1314的第5-7行(,依此类推。我还希望保留所选的具有重复值的行(例如,第5-7行的1314值(。

数据

# A tibble: 42 × 3
ID   abc value
<int> <dbl> <dbl>
1  1259  4530 4054.
2  1617  4415 3902.
3  2441  4250 5286.
4   539  4161 3801.
5  1471  4012 1314.
6   687  3934 1314.
7  2436  3900 1314.
8  1295  3591 3558.
9  1738  3493 1188.
10  1747  3366 3902.
# … with 32 more rows
df <- structure(list(ID = c(1259L, 1617L, 2441L, 539L, 1471L, 687L, 
2436L, 1295L, 1738L, 1747L, 672L, 2187L, 2214L, 738L, 1784L, 
726L, 1712L, 2961L, 137L, 1188L, 1824L, 2856L, 953L, 2579L, 2010L, 
484L, 2769L, 1736L, 2994L, 1572L, 586L, 2462L, 2180L, 1404L, 
1472L, 1007L, 3000L, 545L, 2098L, 2029L, 2557L, 1623L), abc = c(4530, 
4415, 4250, 4161, 4012, 3934, 3900, 3591, 3493, 3366, 3248, 3172, 
3172, 3004, 3004, 2939, 2853, 2782, 2541, 2439, 2371, 2116, 2005, 
1999, 1838, 1749, 1611, 1573, 1416, 1301, 1177, 1074, 975, 805, 
729, 680, 538, 494, 309, 297, 155, 0), value = c(4053.69672793727, 
3902.10003271411, 5286.47420784735, 3801.25160651053, 1314.10007572174, 
1314.10007572174, 1314.10007572174, 3557.56126600696, 1188.20000553131, 
3902.10003271411, 1543.90001773834, 1543.90001773834, 1543.90001773834, 
1228.10004138947, 1228.10004138947, 1618.80007553101, 1618.80007553101, 
2787.70004177094, 2877.32907307533, 1289.59995269775, 2640.10003471375, 
1618.80007553101, 3557.56126600696, 3902.10003271411, 1228.10004138947, 
1329.40004730225, 1228.10004138947, 3557.56126600696, 1618.80007553101, 
1206.79998779297, 2117.7806730578, 1206.79998779297, 1206.79998779297, 
3260.02910244849, 1191.90001773834, 1191.90001773834, 1029.70001125336, 
1336.000041008, 1091.09995365143, 1234.89997673035, 1164.4999704361, 
1191.90001773834)), row.names = c(NA, -42L), class = c("tbl_df", 
"tbl", "data.frame"))

预期输出

ID   abc value
<int> <dbl> <dbl>
1  1259  4530 4054.
2  1617  4415 3902.
3   539  4161 3801.
4  1471  4012 1314.
5   687  3934 1314.
6  2436  3900 1314.
7  1738  3493 1188.
8  3000   538 1030.

我知道我可以这样做,为每一行找到下一个最低值,但我不确定如何通过和filter。由于这可以跳过几行,所以使用laglead对我不起作用。我希望能够使用tidyversedata.tableapply系列来完成此操作。我希望避免使用for循环,除非这是唯一的方法。我有一个更大的数据集,所以我正在寻找一种有效的方法来做到这一点。

library(dplyr)
filter(df, value == cummin(value))

# A tibble: 8 × 3
ID   abc value
<int> <dbl> <dbl>
1  1259  4530 4054.
2  1617  4415 3902.
3   539  4161 3801.
4  1471  4012 1314.
5   687  3934 1314.
6  2436  3900 1314.
7  1738  3493 1188.
8  3000   538 1030.

最新更新