Как добавить идентификатор обращений в список, пока их совокупное значение не достигнет порогового значения в R?

#r #for-loop #cumsum

#r #для цикла #cumsum

Вопрос:

У меня есть таблица с двумя столбцами. У первого есть идентификатор обращений, а у другого — значение. Я хочу добавить идентификаторы в список, и когда совокупное значение достигнет числа (скажем, 500000), список должен быть сохранен, и функция должна продолжаться с того места, где она остановилась, до конца. Как я могу этого добиться?

Например:

Таблица:

ИДЕНТИФИКАТОР: 1234 2345 3512 1353 1457 8756

Значение: 5000 3000 498000 23000 485000 23000

вывод:

первый список: (1234, 2345, 3512) второй список: (1353, 1457) третий список: (8756)

Надеюсь, это достаточно ясно. Заранее благодарю вас.

Данные в виде кода копирования и вставки

 ID <- scan(text = "1234 2345 3512 1353 1457 8756")
Value <- scan(text = "5000 3000 498000 23000 485000 23000")
  

Ответ №1:

Работает ли это?

 library(purrr)

with(df, split(
  ID, 
  cumsum(c(0, head(purrr::accumulate(Value, ~if ((s <- .x   .y) > 500000) 0 else s), -1L)) == 0)
))
  

df выглядит так

 > df
    ID  Value
1 1234   5000
2 2345   3000
3 3512 498000
4 1353  23000
5 1457 485000
6 8756  23000
  

Вывод

 $`1`
[1] 1234 2345 3512

$`2`
[1] 1353 1457

$`3`
[1] 8756
  

Комментарии:

1. Появляется ошибка, если я не удаляю «~» перед функцией «if», в которой говорится «непревзойденная открывающая скобка». Когда я удаляю «~» и запускаю код, он выдает сообщение об ошибке: Ошибка в h (simpleError (msg, call)): ошибка при вычислении аргумента ‘x’ при выборе метода для функции ‘head’: объект ‘.x’ не найден

2. Привет @EkinKaplan, я не могу воспроизвести вашу ошибку. Можете ли вы опубликовать код, который вы пробовали в своем вопросе?

3. Конечно. с помощью (df, split( ID, cumsum(c(0, head(purrr::accumulate(Значение, если ((s <- .x .y) > 500000) 0 else s), -1L)) == 0) ))

4. Привет @EkinKaplan, я все еще не могу воспроизвести вашу проблему. Можете ли вы 1) запустить новый rscript, 2) вставить код, написанный выше (с ~ символом), в этот rscript, 3) запустить код в этом rscript и 4) показать мне полное сообщение об ошибке, если таковое имеется.