So, the problem is, I'm trying to get the first smaller value within the top rows of the transformed variable. My df looks something like:
count |
---|
24 |
33 |
33 |
34 |
35 |
33 |
34 |
35 |
... |
It only contains a column. The output that I'm looking for:
count | close_prev |
---|---|
24 | NA |
33 | 24 |
33 | 24 |
34 | 33 |
35 | 34 |
33 | 24 |
33 | 24 |
34 | 33 |
35 | 34 |
So, I'm looking for the first smaller number from the top rows.
The code I have so far:
table %>%
mutate(close_prev = map_dbl(row_number(), ~closest(count[seq_len(max(.x - 1, 1))], count[.x])))
It's not working :c Can someone help me? Thank you in advance
CodePudding user response:
You can match()
the value against itself and then index the result against count
padded with an NA
.
library(dplyr)
dat %>%
mutate(x = c(NA, count)[match(count, count)])
# A tibble: 9 × 2
count close_prev
<dbl> <dbl>
1 24 NA
2 33 24
3 33 24
4 34 33
5 35 34
6 33 24
7 33 24
8 34 33
9 35 34
CodePudding user response:
You are looking for a rolling join. This is available in dplyr 1.1.0
, which will be soon in CRAN:
devtools::install_github("tidyverse/dplyr")
left_join(a, a, join_by(closest(count > count)), multiple = "first")
count.x count.y
1 24 NA
2 33 24
3 33 24
4 34 33
5 35 34
6 33 24
7 33 24
8 34 33
9 35 34
In data.table
, you can use roll = "nearest"
:
library(data.table)
setDT(a)
a[a, on = "count", roll = "nearest", mult = "first"][]