Накопленная сумма с несколькими критериями

Я пытаюсь получить совокупную сумму из большой таблицы. Мне довольно сложно объяснить это словами, но я могу довольно легко сделать реальный процесс в Excel. Я новичок в R и не знаю, как перевести свои способности в Excel в R.

Моя примерная таблица необработанных данных:

Date       Name     Valid   Population
1/4/2016    US      Yes     -100
1/4/2016    US      Yes     -1000
1/4/2016    Angola  Yes      400
1/5/2016    US      Yes      500
1/6/2016    Angola  Yes      300
1/7/2016    Japan   No      -100
1/8/2016    Japan   Yes     -500
1/8/2016    US      Yes      600
1/9/2016    Angola  Yes     -200
1/10/2016   US      Yes      800

Это то, что я хочу, чтобы мой конечный результат был. Это должен быть отдельный фрейм данных с новыми заголовками столбцов, а столбец «Дата» теперь расположен в последовательном порядке и содержит только уникальные значения.

Date        US     Angola   Japan
1/4/2016    -1100   400     0
1/5/2016    -600    400     0
1/6/2016    -600    700     0
1/7/2016    -600    700     0
1/8/2016     0      700    -500
1/9/2016     0      500    -500
1/10/2016    800    500    -500

Было бы здорово, если бы кто-нибудь помог мне достичь желаемой таблицы.

С уважением, Риддлер.


person RiddleMeThis    schedule 12.07.2016    source источник


Ответы (1)


Предполагая, что ввод DF такой же, как в примечании в конце, мы преобразуем столбец Date в класс "Date", используем xtabs для создания матрицы широкой формы x с суммированием Population в каждой ячейке Date/Name, применяем cumsum к каждому столбцу, получая матрицу a а затем либо просто используйте a, либо, при желании, преобразуйте a во фрейм данных. Пакеты не используются.

DF$Date <- as.Date(DF$Date, format = "%m/%d/%Y")

x <- xtabs(Population ~ Date + Name, DF)
a <- apply(x, 2, cumsum)
data.frame(Date = as.Date(rownames(a)), a, row.names = NULL)

давая:

        Date Angola Japan    US
1 2016-01-04    400     0 -1100
2 2016-01-05    400     0  -600
3 2016-01-06    700     0  -600
4 2016-01-07    700  -100  -600
5 2016-01-08    700  -600     0
6 2016-01-09    500  -600     0
7 2016-01-10    500  -600   800

Примечание. Мы определяем ввод DF воспроизводимо как:

Lines <- "Date       Name     Valid   Population
1/4/2016    US      Yes     -100
1/4/2016    US      Yes     -1000
1/4/2016    Angola  Yes      400
1/5/2016    US      Yes      500
1/6/2016    Angola  Yes      300
1/7/2016    Japan   No      -100
1/8/2016    Japan   Yes     -500
1/8/2016    US      Yes      600
1/9/2016    Angola  Yes     -200
1/10/2016   US      Yes      800"

DF <- read.table(text = Lines, header = TRUE)
person G. Grothendieck    schedule 12.07.2016
comment
Это круто. Спасибо за ответ. Это сработало отлично. Теперь это заботится об одной из моих самых больших частей моего проекта. Я никогда не знал об этой функции xtabs. Все еще не совсем уверен, что он на самом деле делает... но он работает. - person RiddleMeThis; 13.07.2016