具有多个标准的累积和

时间:2016-07-12 18:06:51

标签: r dataframe cumsum

我想从一张大桌子上得到一笔累计金额。 这对我来说很难用文字解释,但我可以在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

任何人都可以帮助我找到理想的桌子。

此致 迷

1 个答案:

答案 0 :(得分:0)

假设输入DF与最后的注释相同,我们将Date列转换为"Date"类,使用xtabs创建宽格式矩阵x在每个Population / Date单元格中Name总结cumsum,将a应用于每列给出矩阵a,然后只使用{{} 1}}或者可选地将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)