![](/img/trans.png)
[英]how to subtract rows in a data frame in R depending on difference between values?
[英]How to find the % difference between values on 2 rows in a data frame in R
我想找到当前值和前一个值之间的差异,并将表格显示为它们之间的百分比差异。
查找连续两行之间差异的代码是:
abcfin <- abcfin %>% mutate_if(is.numeric, list( ~ . - lag(.)))
我用来获得结果的代码是:
asdfg <- abcfin %>% mutate_if(is.numeric, list(ifelse(lag(.)!=0,(. - lag(.))*100/ lag(.)), 0))
但是,我收到以下错误:
-.Date
错误(左,右):只能从“Date”对象中减去另外:警告消息:在矩阵中(if(is.null(value))逻辑()else value,nrow = nr,dimnames = list (rn, : 数据长度 [5974] 不是行数 [543] 的约数或倍数
请让我知道我可以用来获得所需结果的正确代码语句:
如果您是 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.
数据表解决方案:
# 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.