首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >dplyr,purr,在R中动态生成/计算新列

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

Stack Overflow用户
提问于 2019-01-30 14:41:56
回答 1查看 116关注 0票数 0

我有以下问题。我有一个数据帧/tibble,它有(许多)代表不同年份的值的列,例如,一个城市在不同时间点的居民数量。我想现在生成的列,给我的增长率(见附件图片)。它应该类似于在列上循环时使用mutate()。我认为这应该是一个常见的任务,但我找不到任何提示如何做到这一点。

编辑:

最小的示例可能如下所示:

代码语言:javascript
运行
复制
## 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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-30 15:02:00

本例中最简单的方法可能是使您的数据整洁,然后通过对按City分组的数据框使用dplyr的lag()函数来应用您正在使用的计算增长率的公式

代码语言:javascript
运行
复制
## 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))

结果是这样的:

代码语言:javascript
运行
复制
# 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()将其重塑为原始格式。但是,通常不建议这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54434666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档