#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) показать мне полное сообщение об ошибке, если таковое имеется.