我有一个类似下表的数据框。这是我想要改变到水平的增长率(列的级别是我希望拥有的数据,而不是已经存在的数据)。例如,第一个期间的水平为1,第二个期间的水平为0.9998((1-0.0233%)* 1),第三个期间的水平为0.9993((1-0.0432%)* 0.9998),依此类推。
Change Level
1 -0.0054% 1.0000
2 -0.0233% 0.9998
3 -0.0432% 0.9993
4 -0.0323% 0.9990
5 -0.0390% 0.9986
6 0.1901% 1.0005
7 0.1495% 1.0020
8 0.1444% 1.0035
9 0.1584% 1.0051
10 0.4444% 1.0095
我的代码是这样的:df1 <- mutate(df, level0 = 1, level1 = (1+change)*lag(level1, 1))
。但是,它显示"object 'level1' not found"
。我想这是因为level1没有预定义。我想知道进行这种计算的最佳方法是什么。
答案 0 :(得分:0)
根据您的要求,您实际上丢弃了第一个更改(因为您声明在0.0054%更改后该级别应为1),然后取出其后的累积乘积。
如果您将更改存储为非数字数据(这是您显示的内容),则需要先将每个值转换为数字,然后才能从中计算结果。
测试数据
df = read.table(text = "Change
-0.0054%
-0.0233%
-0.0432%
-0.0323%
-0.0390%
0.1901%
0.1495%
0.1444%
0.1584%
0.4444%", header = TRUE, stringsAsFactors = FALSE)
这只是创建一个包含一列的数据框。
计算等级
要添加“级别”列,请将非数字数据更改为数字:
getnumber <- function(x){
as.numeric(gsub("%", "", x))
}
df$Level = c(1, cumprod(1+(getnumber(df[[1]][-1]) / 100)))
df [[1]] [ - 1]中的[-1]是从累积产品中删除第一个值,因为您实际上并未使用它。
> df
Change Level
1 -0.0054% 1.0000000
2 -0.0233% 0.9997670
3 -0.0432% 0.9993351
4 -0.0323% 0.9990123
5 -0.0390% 0.9986227
6 0.1901% 1.0005211
7 0.1495% 1.0020169
8 0.1444% 1.0034638
9 0.1584% 1.0050533
10 0.4444% 1.0095197