OP запросил комментарий для группирующей переменной.
Хотя принятый ответ, по-видимому, делает то, о чем первоначально просил OP, я хотел бы предложить совершенно другой подход, где данные хранятся и обрабатываются в формате tidy (long) . IMHO, обработка данных в длинном формате намного более проста и гибка (включая агрегацию и группировку).
Для этого набор данных изменяется с широкого формата в стиле Excel на длинный формат в стиле SQL by
library(data.table)
col <- "NoR"
long <- melt(DF, measure.vars = patterns(col), value.name = col, variable.name = "range")
long[, range := stringr::str_remove(range, paste0(col, "_"))]
long
No_Adjusted_Gross_Income range NoR
1: 183454 from_1_to_5000 1035373
2: 241199 from_1_to_5000 4272260
3: 249506 from_1_to_5000 1124098
4: 183454 from_5000_to_10000 319540
5: 241199 from_5000_to_10000 4826042
6: 249506 from_5000_to_10000 1959866
В аккуратном (длинном) формате есть одна строка для каждого наблюдения и один столбец для каждой переменной (см. главу 12.2 книги Хэдли Уикхема R для науки о данных .
Вектор множителей val
также необходимо изменить с широкого на длинный формат:
valDF <- long[, .(range = unique(range), val)]
valDF
range val
1: from_1_to_5000 2500.5
2: from_5000_to_10000 7500.0
Теперь valDF
также имеет аккуратный формат, так как для каждого range
есть одна строка.
Наконец, мы можем добавить новый столбец AGI
в DF
с помощью обновление соединения :
long[valDF, on = "range", AGI := val * NoR][]
No_Adjusted_Gross_Income range NoR AGI
1: 183454 from_1_to_5000 1035373 2588950187
2: 241199 from_1_to_5000 4272260 10682786130
3: 249506 from_1_to_5000 1124098 2810807049
4: 183454 from_5000_to_10000 319540 2396550000
5: 241199 from_5000_to_10000 4826042 36195315000
6: 249506 from_5000_to_10000 1959866 14698995000
Если требуется для презентации, набор данных может быть преобразован из длинного в широкий формат:
dcast(long, No_Adjusted_Gross_Income ~ range, value.var = c("NoR", "AGI"))
No_Adjusted_Gross_Income NoR_from_1_to_5000 NoR_from_5000_to_10000 AGI_from_1_to_5000 AGI_from_5000_to_10000
1: 183454 1035373 319540 2588950187 2396550000
2: 241199 4272260 4826042 10682786130 36195315000
3: 249506 1124098 1959866 2810807049 14698995000
, который воспроизводит ожидаемый результат OP. Обратите внимание, что имена переменных vn
- cr выполняется автоматически.
Агрегация и группировка могут выполняться при изменении формы
dcast(long, No_Adjusted_Gross_Income ~ range, sum, value.var = c("NoR", "AGI"))
No_Adjusted_Gross_Income NoR_from_1_to_5000 NoR_from_5000_to_10000 AGI_from_1_to_5000 AGI_from_5000_to_10000
1: 183454 1035373 319540 2588950187 2396550000
2: 241199 4272260 4826042 10682786130 36195315000
3: 249506 1124098 1959866 2810807049 14698995000
или
dcast(long, No_Adjusted_Gross_Income ~ ., sum, value.var = c("NoR", "AGI"))
No_Adjusted_Gross_Income NoR AGI
1: 183454 1354913 4985500187
2: 241199 9098302 46878101130
3: 249506 3083964 17509802049
В качестве альтернативы агрегация и группировка могут выполняться в длинном формате:
long[, lapply(.SD, sum), .SDcols = c("NoR", "AGI"), by = No_Adjusted_Gross_Income]
No_Adjusted_Gross_Income NoR AGI
1: 183454 1354913 4985500187
2: 241199 9098302 46878101130
3: 249506 3083964 17509802049