【问题标题】:Calculating rate of change over rows in R in multiple large datasets计算多个大型数据集中 R 中行的变化率
【发布时间】:2022-01-19 12:45:08
【问题描述】:

我目前处理多个具有相同行号但不同列号的大型数据集。现在我需要计算列之间的变化率并将其添加到新对象或现有对象中以继续我的分析。

在我对网络的研究中,我通常只遇到有人试图计算列中的变化率,而不是那些之间的变化。翻转所有数据是最简单的方法吗?

我很抱歉我对我的问题的模糊描述,因为 R 和英语不是我的第一语言。

希望你还能为我指明方向,进一步加深我对 R 的理解。

提前感谢您提供的任何提示!

【问题讨论】:

  • 我想你在找this

标签: r indices


【解决方案1】:

我建议将所有数据连接在一起,然后将其转换为 3NF 规范化长格式表:

library(tidyverse)

data1 <- tibble(
  country = c("A", "B", "C"),
  gdp_2020 = c(1, 8, 10),
  gdp_2021 = c(1, 8, 10),
  population_2010 = c(5e3, 6e3, 6e3),
  population_2020 = c(5.5e3, 6.8e3, 6e3)
)
data1
#> # A tibble: 3 x 5
#>   country gdp_2020 gdp_2021 population_2010 population_2020
#>   <chr>      <dbl>    <dbl>           <dbl>           <dbl>
#> 1 A              1        1            5000            5500
#> 2 B              8        8            6000            6800
#> 3 C             10       10            6000            6000

data2 <- tibble(
  country = c("A", "B", "C"),
  population_2021 = c(7e3, 8e3, 7e3),
  population_2022 = c(7e3, 7e3, 10e3)
)
data2
#> # A tibble: 3 x 3
#>   country population_2021 population_2022
#>   <chr>             <dbl>           <dbl>
#> 1 A                  7000            7000
#> 2 B                  8000            7000
#> 3 C                  7000           10000

list(
  data1,
  data2
) %>%
  reduce(full_join) %>%
  pivot_longer(matches("^(gdp|population)")) %>%
  separate(name, into = c("variable", "year"), sep = "_") %>%
  type_convert() %>%
  arrange(country, variable, year) %>%
  group_by(variable, country) %>%
  mutate(
    # NA for the first value because it does not have a precursor to calculate change
    change_rate = (value - lag(value)) / (year - lag(year))
  )
#> Joining, by = "country"
#> 
#> ── Column specification ────────────────────────────────────────────────────────
#> cols(
#>   country = col_character(),
#>   variable = col_character(),
#>   year = col_double()
#> )
#> # A tibble: 18 x 5
#> # Groups:   variable, country [6]
#>    country variable    year value change_rate
#>    <chr>   <chr>      <dbl> <dbl>       <dbl>
#>  1 A       gdp         2020     1          NA
#>  2 A       gdp         2021     1           0
#>  3 A       population  2010  5000          NA
#>  4 A       population  2020  5500          50
#>  5 A       population  2021  7000        1500
#>  6 A       population  2022  7000           0
#>  7 B       gdp         2020     8          NA
#>  8 B       gdp         2021     8           0
#>  9 B       population  2010  6000          NA
#> 10 B       population  2020  6800          80
#> 11 B       population  2021  8000        1200
#> 12 B       population  2022  7000       -1000
#> 13 C       gdp         2020    10          NA
#> 14 C       gdp         2021    10           0
#> 15 C       population  2010  6000          NA
#> 16 C       population  2020  6000           0
#> 17 C       population  2021  7000        1000
#> 18 C       population  2022 10000        3000

reprex package (v2.0.1) 于 2021 年 12 月 16 日创建

示例:第二行的变化率(A 国的 gdp)为 0,因为 2021 年和 2020 年都相同。

【讨论】:

  • 我想计算 id 和 foo 之间的 roc 并添加一个新列。但是想象一下有 20 列,所以我想添加 19 个新列,其变化率从 col1 到 col2、从 col2 到 col3 等。
  • idfoo 之间的变化率是什么意思?在我的示例中,foo 的变化是当前行中 foo 与上一行中的差异。
  • 所以我的数据结构如下:我的行是国家,我的列是给定年份的变量。有时我有每个国家 20 年的数据,有时只有 3 年。我有大约 20 个不同的数据集。我需要一种方法来获取每个国家/地区的年份之间的变化率。因此,在我的数据中,“id”到“foo”之间的变化率将是保加利亚 2019 年至 2020 年的总收入。
  • 您每年有一份 Excel 工作表或文件吗?时间是如何编码的?
  • 我有一张 Excel 表,入口点约为 500k。每个国家都有一行,大约有 100 个列,我已经将它们分成 R 中的变量组,以便我在给定时间内拥有“仅包含一个变量”的对象。这些是我需要为其计算 roc 的多个对象。时间仅在 col 名称本身中编码为一年。
猜你喜欢
  • 2017-04-27
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多