Home > Software design >  Difference in values between rows after group_by
Difference in values between rows after group_by

Time:11-14

I want to calculate the difference in values for the following row after the previous. However, I am getting this error:

Error in mutate(): ! Problem while computing ..1 = across(where(is.numeric), diff). ℹ The error occurred in group 1: vs = 0 Caused by error in across(): ! Problem while computing column mpg. Caused by error in dplyr_internal_error(): Run rlang::last_error() to see where the error occurred.

Here is what I have tried:

mtcars %>% group_by(vs) %>% mutate(across(where(is.numeric), diff))

This seems to do the trick:

mtcars %>% group_by(vs) %>% aggregate(. ~ vs, data=., diff) %>% as.data.frame() %>% unnest()

#//--
# A tibble: 30 × 11
      vs    mpg   cyl   disp    hp    drat      wt    qsec    am  gear  carb
   <dbl>  <dbl> <dbl>  <dbl> <dbl>   <dbl>   <dbl>   <dbl> <dbl> <dbl> <dbl>
 1     0  0         0    0       0  0       0.255   0.560      0     0     0
 2     0 -2.3       2  200      65 -0.75    0.565   0         -1    -1    -2
 3     0 -4.4       0    0      70  0.0600  0.130  -1.18       0     0     2
 4     0  2.10      0  -84.2   -65 -0.140   0.500   1.56       0     0    -1
 5     0  0.900     0    0       0  0      -0.340   0.200      0     0     0
 6     0 -2.10      0    0       0  0       0.0500  0.400      0     0     0
 7     0 -4.8       0  196.     25 -0.140   1.47   -0.0200     0     0     1
 8     0  0         0  -12      10  0.0700  0.174  -0.160      0     0     0
 9     0  4.3       0  -20      15  0.23   -0.0790 -0.400      0     0     0
10     0  0.800     0 -122     -80 -0.47   -1.82   -0.550      0     0    -2
# … with 20 more rows

CodePudding user response:

You could explicitly define the calculation using lag. Or you could do this in base R:

library(tidyverse)

#tidyverse
mtcars %>% 
  group_by(vs) %>% 
  mutate(across(where(is.numeric), ~.-lag(., default = first(.)))) |>
  arrange(vs)
#> # A tibble: 32 x 11
#> # Groups:   vs [2]
#>       mpg   cyl  disp    hp    drat      wt    qsec    vs    am  gear  carb
#>     <dbl> <dbl> <dbl> <dbl>   <dbl>   <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1  0         0   0       0  0       0       0          0     0     0     0
#>  2  0         0   0       0  0       0.255   0.560      0     0     0     0
#>  3 -2.3       2 200      65 -0.75    0.565   0          0    -1    -1    -2
#>  4 -4.4       0   0      70  0.0600  0.130  -1.18       0     0     0     2
#>  5  2.10      0 -84.2   -65 -0.140   0.500   1.56       0     0     0    -1
#>  6  0.900     0   0       0  0      -0.340   0.200      0     0     0     0
#>  7 -2.10      0   0       0  0       0.0500  0.400      0     0     0     0
#>  8 -4.8       0 196.     25 -0.140   1.47   -0.0200     0     0     0     1
#>  9  0         0 -12      10  0.0700  0.174  -0.160      0     0     0     0
#> 10  4.3       0 -20      15  0.23   -0.0790 -0.400      0     0     0     0
#> # ... with 22 more rows

#base R
by(mtcars, mtcars$vs, \(x) apply(x, 2, diff)) |>
  do.call(what = rbind.data.frame)
#>                         mpg cyl   disp  hp  drat     wt  qsec vs am gear carb
#> 0.Mazda RX4 Wag         0.0   0    0.0   0  0.00  0.255  0.56  0  0    0    0
#> 0.Hornet Sportabout    -2.3   2  200.0  65 -0.75  0.565  0.00  0 -1   -1   -2
#> 0.Duster 360           -4.4   0    0.0  70  0.06  0.130 -1.18  0  0    0    2
#> 0.Merc 450SE            2.1   0  -84.2 -65 -0.14  0.500  1.56  0  0    0   -1
#> 0.Merc 450SL            0.9   0    0.0   0  0.00 -0.340  0.20  0  0    0    0
#> 0.Merc 450SLC          -2.1   0    0.0   0  0.00  0.050  0.40  0  0    0    0
#> 0.Cadillac Fleetwood   -4.8   0  196.2  25 -0.14  1.470 -0.02  0  0    0    1
#> 0.Lincoln Continental   0.0   0  -12.0  10  0.07  0.174 -0.16  0  0    0    0
#> 0.Chrysler Imperial     4.3   0  -20.0  15  0.23 -0.079 -0.40  0  0    0    0
#> 0.Dodge Challenger      0.8   0 -122.0 -80 -0.47 -1.825 -0.55  0  0    0   -2
#> 0.AMC Javelin          -0.3   0  -14.0   0  0.39 -0.085  0.43  0  0    0    0
#> 0.Camaro Z28           -1.9   0   46.0  95  0.58  0.405 -1.89  0  0    0    2
#> 0.Pontiac Firebird      5.9   0   50.0 -70 -0.65  0.005  1.64  0  0    0   -2
#> 0.Porsche 914-2         6.8  -4 -279.7 -84  1.35 -1.705 -0.35  0  1    2    0
#> 0.Ford Pantera L      -10.2   4  230.7 173 -0.21  1.030 -2.20  0  0    0    2
#> 0.Ferrari Dino          3.9  -2 -206.0 -89 -0.60 -0.400  1.00  0  0    0    2
#> 0.Maserati Bora        -4.7   2  156.0 160 -0.08  0.800 -0.90  0  0    0    2
#> 1.Hornet 4 Drive       -1.4   2  150.0  17 -0.77  0.895  0.83  0 -1   -1    0
#> 1.Valiant              -3.3   0  -33.0  -5 -0.32  0.245  0.78  0  0    0    0
#> 1.Merc 240D             6.3  -2  -78.3 -43  0.93 -0.270 -0.22  0  0    1    1
#> 1.Merc 230             -1.6   0   -5.9  33  0.23 -0.040  2.90  0  0    0    0
#> 1.Merc 280             -3.6   2   26.8  28  0.00  0.290 -4.60  0  0    0    2
#> 1.Merc 280C            -1.4   0    0.0   0  0.00  0.000  0.60  0  0    0    0
#> 1.Fiat 128             14.6  -2  -88.9 -57  0.16 -1.240  0.57  0  1    0   -3
#> 1.Honda Civic          -2.0   0   -3.0 -14  0.85 -0.585 -0.95  0  0    0    1
#> 1.Toyota Corolla        3.5   0   -4.6  13 -0.71  0.220  1.38  0  0    0   -1
#> 1.Toyota Corona       -12.4   0   49.0  32 -0.52  0.630  0.11  0 -1   -1    0
#> 1.Fiat X1-9             5.8   0  -41.1 -31  0.38 -0.530 -1.11  0  1    1    0
#> 1.Lotus Europa          3.1   0   16.1  47 -0.31 -0.422 -2.00  0  0    1    1
#> 1.Volvo 142E           -9.0   0   25.9  -4  0.34  1.267  1.70  0  0   -1    0
  •  Tags:  
  • r
  • Related