我有一个数据帧,它按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
。由于这可以跳过几行,所以使用lag
和lead
对我不起作用。我希望能够使用tidyverse
或data.table
或apply
系列来完成此操作。我希望避免使用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.