Рассчитать годовое абсолютное изменение R - PullRequest
1 голос
/ 11 июля 2020

Задайте фрейм данных df следующим образом:

df <- structure(list(year = c(2001, 2002, 2003, 2004), `1` = c(22.0775, 
24.2460714285714, 29.4039285714286, 27.7110714285714), `2` = c(27.2535714285714, 
35.9996428571429, 26.39, 27.8557142857143), `3` = c(24.7710714285714, 
25.4428571428571, 15.1142857142857, 19.9657142857143)), row.names = c(NA, 
-4L), groups = structure(list(year = c(2001, 2002, 2003, 2004
), .rows = structure(list(1L, 2L, 3L, 4L), ptype = integer(0), class = c("vctrs_list_of", 
"vctrs_vctr", "list"))), row.names = c(NA, 4L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

Out:

   year         1         2         3
0  2001  22.07750  27.25357  24.77107
1  2002  24.24607  35.99964  25.44286
2  2003  29.40393  26.39000  15.11429
3  2004  27.71107  27.85571  19.96571

Для столбца 1, 2 and 3, как я могу рассчитать абсолютное изменение от года к году?

Ожидаемый результат будет выглядеть так:

   year        1        2         3
0  2002  2.16857  8.74607   0.67179
1  2003  5.15786  9.60964  10.32857
2  2004  1.69286  1.46571   4.85142 

Конечная цель - сравнить значения 1, 2, 3 столбцов за все годы, найти год и столбец наибольшего изменения, в этом примере это должно быть 2003 и столбец 3.

Как я могу сделать это в R? Спасибо.

Ответы [ 3 ]

1 голос
/ 11 июля 2020

Вы можете попробовать:

library(reshape2)
library(dplyr)
#Melt
Melted <- reshape2::melt(df,id.vars = 'year')
#Group
Melted %>% group_by(variable) %>% mutate(Diff=c(0,abs(diff(value)))) %>% ungroup() %>%
  filter(Diff==max(Diff))

# A tibble: 1 x 4
   year variable value  Diff
  <dbl> <fct>    <dbl> <dbl>
1  2003 3         15.1  10.3
1 голос
/ 11 июля 2020

Мы можем применить diff ко всему набору данных, преобразовав числовые c столбцы, представляющие интерес, в matrix в base R

cbind(year = df$year[-1], abs(diff(as.matrix(df[-1]))))
#     year        1        2          3
#[1,] 2002 2.168571 8.746071  0.6717857
#[2,] 2003 5.157857 9.609643 10.3285714
#[3,] 2004 1.692857 1.465714  4.8514286
1 голос
/ 11 июля 2020

Вы можете использовать:

library(dplyr)
data <- df %>% ungroup %>%  summarise(across(-1, ~abs(diff(.))))
data

# A tibble: 3 x 3
#    `1`   `2`    `3`
#  <dbl> <dbl>  <dbl>
#1  2.17  8.75  0.672
#2  5.16  9.61 10.3  
#3  1.69  1.47  4.85 

Чтобы получить максимальную сдачу

mat <- which(data == max(data), arr.ind = TRUE)
mat
#     row col
#[1,]   2   3

#Year name
df$year[mat[, 1] + 1]
#[1] 2003
#Column name
mat[, 2]
#col 
#  3 
...