Найдите максимальное значение в столбце списка, которое меньше или равно значению другого столбца в R - PullRequest
1 голос
/ 13 июля 2020

У меня есть следующая таблица:

tbl1 <- tibble::tribble(
~numberEvent, ~numberNovo,
"497",        "497",
"498",        "498",
"499",        "499",
"500",        "500",
"501",        "498, 506",
"502",        "502",
"503",        "503",
"504",        "504",
"505",        "505",
"506",        "506",
"507",        "498, 506")

Я пытаюсь создать новый столбец с максимальным значением из столбца numberNovo, которое меньше или равно значению из столбца numberEvent. Поэтому в строке 5 я хочу получить в результате 498, поскольку это максимальное значение меньше 501. В последней строке желаемый результат будет 506.

Я попытался повернуть номер столбцаNovo в столбец списка, но я не знаю, как оттуда go. Любая помощь приветствуется.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Мы могли бы использовать separate_rows, чтобы разделить столбец, а затем создать группу, получив разницу между 'numberEvent' и 'numberNovo', найти индекс max разницы для подмножества 'numberNovo' и связать его с исходные данные

library(dplyr)
library(tidyr)
tbl1 %>%
    separate_rows(numberNovo, convert = TRUE) %>% 
    group_by(grp = numberEvent) %>%
    summarise(maxNovo = numberNovo[which.max(as.integer(numberEvent) - 
             numberNovo)])   %>%  
    select(maxNovo) %>% 
    bind_cols(tbl1, .)
# A tibble: 11 x 3
#   numberEvent numberNovo maxNovo
#   <chr>       <chr>        <int>
# 1 497         497            497
# 2 498         498            498
# 3 499         499            499
# 4 500         500            500
# 5 501         498, 506       498
# 6 502         502            502
# 7 503         503            503
# 8 504         504            504
# 9 505         505            505
#10 506         506            506
#11 507         498, 506       498
0 голосов
/ 14 июля 2020

Я придумал другой способ использования purrr, для всех, кому интересно:

tbl1 %>% 
     mutate(maxNovo = str_split(numberNovo, ", "),
            maxNovo = map(maxNovo , ~as.numeric(.)),
            maxNovo = map2_dbl(maxNovo , numberEvent, ~ max(.x[.x <= .y]))) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...