我正在努力计算公司的年度净销售额之间的百分比差异,并考虑到NA。
以下是数据示例:
dt <- data.table(lpermno = c(10065, 10065, 10065, 10065, 59328, 61241, 59328, 61241, 59328, 61241, 59328, 61241), fyear = c(2001, 2002, 2003, 2004, 2001, 2001, 2002, 2002, 2003, 2003, 2004, 2004), sale = c(NA, NA, NA, NA, 26539, 3891.754, 26764, 2697.029, 30141, 3519.168, 34209, 5001.435))
lpermno fyear sale
10065 2001 NA
10065 2002 NA
10065 2003 NA
10065 2004 NA
59328 2001 26539.000
59328 2002 26764.000
59328 2003 30141.000
59328 2004 34209.000
61241 2001 3891.754
61241 2002 2697.029
61241 2003 3519.168
61241 2004 5001.435
我想计算一个称为sales_change的新变量。此变量应为出售百分比变化。
[sale_n]/[sale_n-1] for each company.
对于公司的首次观察,sales_change只需为1。
我已阅读以下帖子以获取指导,但没有成功。
对于我上面给出的示例数据,所需的输出将是:
output <- data.table(lpermno = c(10065, 10065, 10065, 10065, 59328, 59328, 59328, 59328, 61241, 61241, 61241, 61241), fyear = c(2001, 2002, 2003, 2004, 2001, 2002, 2003, 2004, 2001, 2002, 2003, 2004), sale = c(NA, NA, NA, NA, 3891.754, 2697.029, 3519.168, 5001.435, 26539, 26764, 30141, 34209), output = c(NA, NA, NA, NA, 1, 0.693011, 1.304831, 1.421198, 1, 1.008478, 1.126177, 1.134966))
lpermno fyear sale output
10065 2001 NA NA
10065 2002 NA NA
10065 2003 NA NA
10065 2004 NA NA
59328 2001 3891.754 1.000000
59328 2002 2697.029 0.693011
59328 2003 3519.168 1.304831
59328 2004 5001.435 1.421198
61241 2001 26539.000 1.000000
61241 2002 26764.000 1.008478
61241 2003 30141.000 1.126177
61241 2004 34209.000 1.134966
希望您能提供一些帮助。预先感谢。
答案 0 :(得分:6)
使用data.table
,您可以执行以下操作:
dt[, pctchnge := sale / c(sale[1], head(sale, -1)), by="lpermno"][order(lpermno)]
在这里,用:=
创建一个新变量,重复销售的第一个月,并用分号结尾的最后一个月删除。由lpermno执行计算。然后按lpermno排序。
这将返回
lpermno fyear sale pctchnge
1: 10065 2001 NA NA
2: 10065 2002 NA NA
3: 10065 2003 NA NA
4: 10065 2004 NA NA
5: 59328 2001 26539.000 1.0000000
6: 59328 2002 26764.000 1.0084781
7: 59328 2003 30141.000 1.1261770
8: 59328 2004 34209.000 1.1349657
9: 61241 2001 3891.754 1.0000000
10: 61241 2002 2697.029 0.6930112
11: 61241 2003 3519.168 1.3048314
12: 61241 2004 5001.435 1.4211981
答案 1 :(得分:3)
您可以使用by
,该函数将功能应用于由lpermno
分割的数据帧。
在拆分的同时,相对变化公式应用于每个子数据帧的sales
列,这些子数据帧由cbind
与新的output
列组合。使用if
,我们可以控制anyNA
个案例,并抛出NA
,因为无法计算出有意义的均值。使用do.call(rbind)
,我们将数据帧放回原处。
do.call(rbind, by(dt, dt$lpermno, function(x)
if (anyNA(x$sale)) return(cbind(x, output=NA))
else return (cbind(x, output=c(1, 1/x$sale[-length(x$sale)]*c(x$sale[-1]))))))
# lpermno fyear sale output
# 1: 10065 2001 NA NA
# 2: 10065 2002 NA NA
# 3: 10065 2003 NA NA
# 4: 10065 2004 NA NA
# 5: 59328 2001 26539.000 1.0000000
# 6: 59328 2002 26764.000 1.0084781
# 7: 59328 2003 30141.000 1.1261770
# 8: 59328 2004 34209.000 1.1349657
# 9: 61241 2001 3891.754 1.0000000
# 10: 61241 2002 2697.029 0.6930112
# 11: 61241 2003 3519.168 1.3048314
# 12: 61241 2004 5001.435 1.4211981
数据
dt <- structure(list(lpermno = c(10065, 10065, 10065, 10065, 59328,
61241, 59328, 61241, 59328, 61241, 59328, 61241), fyear = c(2001,
2002, 2003, 2004, 2001, 2001, 2002, 2002, 2003, 2003, 2004, 2004
), sale = c(NA, NA, NA, NA, 26539, 3891.754, 26764, 2697.029,
30141, 3519.168, 34209, 5001.435)), row.names = c(NA, -12L), class = c("data.table",
"data.frame"))