我想找到当前值和上一个值之间的差异,并将表格显示为它们之间的百分比差异。
找到两个连续行之间的差异的代码是:
abcfin <- abcfin %>% mutate_if(is.numeric, list( ~ . - lag(.)))
我用来获取结果的代码是:
asdfg <- abcfin %>% mutate_if(is.numeric, list(ifelse(lag(.)!=0,(. - lag(.))*100/ lag(.)), 0))
但是,出现以下错误:
-.Date
(左,右)中的错误:只能从“日期”对象中减去 另外:警告消息: 在矩阵中(如果(is.null(value))logical()else value,nrow = nr,dimnames = list(rn,: 数据长度[5974]不是行数[543]的约数或倍数
请让我知道可以用来获取所需结果的正确代码语句:
答案 0 :(得分:0)
如果您不熟悉R,这是另一种可能更容易遵循的方法:
library(tidyverse)
date <- seq(as.Date("2015/1/1"), by = "month", length.out = 6)
var1 <- c(723, 983, 437, 732, 173, 537)
var2 <- c(753, 769, 352, 853, 143, 485)
df <- data.frame(date, var1, var2)
df <- df %>% mutate(var1_prev = lag(var1), var2_prev = lag(var2))
df <- df[-1,] #removes unnecessary first row
df <- df %>% mutate(var1_perdiff = (var1 - var1_prev)/var1_prev * 100,
var2_perdiff = (var2 - var2_prev)/var2_prev * 100)
as_tibble(df)
# A tibble: 5 x 7
#date var1 var2 var1_prev var2_prev var1_perdiff var2_perdiff
#<date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 2015-02-01 983 769 723 753 36.0 2.12
#2 2015-03-01 437 352 983 769 -55.5 -54.2
#3 2015-04-01 732 853 437 352 67.5 142.
#4 2015-05-01 173 143 732 853 -76.4 -83.2
#5 2015-06-01 537 485 173 143 210. 239.
答案 1 :(得分:0)
data.table解决方案:
# set to data.table
library(data.table)
df <- setDT(df)
# your percentage function
perct.fun <- function(x){-100 + (x/shift(x,1,type = "lag"))*100}
# add the new variables
v <- c("var1","var2")
df[order(date), (paste0(v, "_diff")) := lapply(.SD, perct.fun), .SDcols=v]
date var1 var2 var1_diff var2_diff
1: 2015-01-01 723 753 NA NA
2: 2015-02-01 983 769 35.96127 2.124834
3: 2015-03-01 437 352 -55.54425 -54.226268
4: 2015-04-01 732 853 67.50572 142.329545
5: 2015-05-01 173 143 -76.36612 -83.235639
6: 2015-06-01 537 485 210.40462 239.160839