具有多个条件的累积和
Cumulative Sum with Multiple Criteria
我正在尝试从一个大 table 中获取累计总和。
这对我来说很难用语言来解释,但我可以在 Excel 中很容易地完成实际过程。我是 R 的新手,不知道如何将我在 Excel 中的能力转化为 R。
我的原始数据示例 table:
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
任何人都可以帮助我实现所需的 table。
真诚的,
谜语人
假设输入DF
如末尾注释,我们将Date
列转换为"Date"
class,使用xtabs
要在每个 Date
/Name
单元格中创建具有 Population
总和的宽格式矩阵 x
,请将 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)
我正在尝试从一个大 table 中获取累计总和。 这对我来说很难用语言来解释,但我可以在 Excel 中很容易地完成实际过程。我是 R 的新手,不知道如何将我在 Excel 中的能力转化为 R。
我的原始数据示例 table:
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
任何人都可以帮助我实现所需的 table。
真诚的, 谜语人
假设输入DF
如末尾注释,我们将Date
列转换为"Date"
class,使用xtabs
要在每个 Date
/Name
单元格中创建具有 Population
总和的宽格式矩阵 x
,请将 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)