【问题标题】:Comparing a variable with itself in the previous year in R在R中将变量与上一年的自身进行比较
【发布时间】:2021-03-31 20:18:12
【问题描述】:

我对编程还是很陌生,并且遇到了一些我无法找到解决方案的问题,尽管可能部分原因是我不知道如何表达我的搜索查询(英语是'不是我的母语......)。无论如何,我有一个格式如下的数据集(简化;有更多年和数周的数据,还有更多商品):

GoodID Year Week Price
1 2015 3 X1
1 2015 4 Y1
1 2016 3 Z1
1 2016 4 U1
1 2017 3 V1
1 2017 4 W1
2 2015 3 X2
2 2015 4 Y2
2 2016 3 Z2
2 2016 4 U2

我想做的是添加一列,显示某种商品一年前的价格。也就是说,它应该显示同一周但一年前的价格。

GoodID Year Week Price Price last year
1 2015 3 X1 NA
1 2015 4 Y1 NA
1 2016 3 Z1 X1
1 2016 4 U1 Y1
1 2017 3 V1 Z1
1 2017 4 W1 U1
2 2015 3 X2 NA
2 2015 4 Y2 NA
2 2016 3 Z2 X2
2 2016 4 U2 Y2

我正在使用 tidyverse。以前我对这些年来的平均很好,这很容易:

df <- df %>%
group_by(GoodID, week)%>%
mutate(avgprice = mean(Price)) %>%
ungroup()

但是当我想将价格与一年前的价格进行比较时,我完全迷失了。听起来应该有一个简单的解决方案,比如

mutate(lastprice = Year-1$Price)

但显然这行不通,我不知道该怎么说。我试图过滤数据

df <- df %>%
filter(year == 2017) %>%
mutate(lastprice = Price)

df <- df %>%
filter(year == 2016) %>%
mutate(lastprice = Price)

但这当然只会导致第一次尝试清除所有其他年份的数据条目。

有没有人对我如何做这件事有建议?谢谢!

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    使用lag() 访问上一行的值。只要我们按 Good 和 Week 分组并按年份排序,那应该就是上一年的价格:

    df %>% 
      group_by(GoodID, Week) %>%
      arrange(Year) %>%
      mutate(Price_Last_Year = lag(Price)) %>%
      ungroup()
    

    【讨论】:

      【解决方案2】:

      这是一个建议的解决方案(对于以后的帖子,请包含代码,以便可以轻松创建您的数据框,以便人们可以测试任何响应):

      df %>%
        arrange(week, year) %>%
        group_by(Good_ID, week) %>%
        mutate(price_last_year = lag(price))
      

      关键方面是dplyr::lag(),它负责引用前一行的值。在边界处引入NAs 就足够聪明了(即每个组的第一个条目)。

      【讨论】:

      • @MacAskill。现在它起作用了! +/- 这与 Gregor Thomas 的答案相同。同时!!!为两者投票!!!
      • 是的,与 Gegor 的答案几乎相同,但我认为我的答案可能是 week 的冗余排序,我猜这是由 group_by 处理的,所以我认为他赢了简明扼要。
      猜你喜欢
      • 2021-06-09
      • 2021-12-17
      • 2023-03-16
      • 2015-01-24
      • 2013-01-05
      • 1970-01-01
      • 2017-07-09
      相关资源
      最近更新 更多