如何在R中的数据帧中找到2行的值之间的百分比差异

时间:2019-06-18 20:08:00

标签: r dataframe

我想找到当前值和上一个值之间的差异,并将表格显示为它们之间的百分比差异。

找到两个连续行之间的差异的代码是:

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]的约数或倍数

请让我知道可以用来获取所需结果的正确代码语句:

enter image description here

2 个答案:

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