将百分比变化转换为R中的水平

时间:2018-01-25 20:59:39

标签: r

我有一个类似下表的数据框。这是我想要改变到水平的增长率(列的级别是我希望拥有的数据,而不是已经存在的数据)。例如,第一个期间的水平为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没有预定义。我想知道进行这种计算的最佳方法是什么。

1 个答案:

答案 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