dplyr,purr,动态生成/计算R中的新列

时间:2019-01-30 06:41:56

标签: r dplyr purrr

我有以下问题。我有一个数据框/小工具,其中有(很多)列表示不同年份的值,例如一个城市在不同时间点的居民人数。我现在想生成可以给我增长速度的列(请参阅所附图片)。就像在循环遍历列时使用mutate()一样。我认为这应该是一项常见的任务,但我找不到任何提示。

编辑:

一个最小的例子可能是这样的:

## Minimal example

library(tidyverse)

## Given data frame

df <- tibble(
        City = c("Melbourne", "Sydney", "Adelaide"),
        year_2000 = c(100, 100, 205),
        year_2001 = c(101, 100, 207),
        year_2002 = c(102, 100, 209)
        )

## Result

df <- df %>%
  mutate(
    gr_2000_2001 = year_2001/year_2000*100 - 100,
    gr_2001_2002 = year_2002/year_2001*100 - 100
  )

我想找到一种方法来以智能的方式自动执行mutate命令,因为我必须做150年。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

在此示例中,最简单的方法可能是使数据整齐,然后通过将dplyr的lag()函数应用于按City分组的数据框来应用您用来计算增长率的任何公式:

## Minimal example
library(tidyverse)
df <- data.frame(City = c("Melbourne", "Sydney"),
             year_2000 = c(100, 100),
             year_2001 = c(101,100),
             year_2002 = c(102, 102))

df %>%
  gather(year, value, 2:4) %>%
  group_by(City) %>%
  mutate(growth = value/dplyr::lag(value,n=1))

结果是这样的:

# A tibble: 6 x 4
# Groups:   City [2]
  City      year      value growth
  <fct>     <chr>     <dbl>  <dbl>
1 Melbourne year_2000   100  NA   
2 Sydney    year_2000   100  NA   
3 Melbourne year_2001   101   1.01
4 Sydney    year_2001   100   1   
5 Melbourne year_2002   102   1.01
6 Sydney    year_2002   102   1.02

如果您绝对需要屏幕截图中提供的格式的数据,则可以应用spread()将其重塑为原始格式。但是,一般不建议这样做。