簡體   English   中英

在第一時間段內通過值標准化時間序列的最優雅方法是什么?

[英]What is the most elegant way to standardize a time series by the value in the first period?

我有一個按產品和年份進行銷售的數據框,並且想創建一個列,將每個產品年份除以2000年的Sales值,然后按產品分別划分,以創建“調整后的銷售額”( adj_Sales )。

library(plyr)
df <- data.frame(Product=gl(3,3,labels=c("A","B", "C")), 
         Year=factor(rep(2000:2002,3)), 
         Sales=1:9)

print(df)
#   Product Year Sales
# 1       A 2000     1
# 2       A 2001     2
# 3       A 2002     3
# 4       B 2000     4
# 5       B 2001     5
# 6       B 2002     6
# 7       C 2000     7
# 8       C 2001     8
# 9       C 2002     9

以下代碼可以工作,但由於它不是很優雅:

  • a)創建一個中間數據幀( base_sales ),
  • b)與中間數據幀( base_sales )和原始數據幀( df )合並使用,
  • c)需要執行一個步驟以將Sales列重命名為Sales_2000
  • d)創建一個不需要的Sales_2000列,並且

有沒有辦法使用plyr或dplyr一次完成所有操作?

base_sales <- df[df$Year==2000, c("Product","Sales")]
base_sales <- plyr::rename(base_sales, c("Sales" = "Sales_2000"))

print(base_sales)
#   Product Sales_2000
# 1       A          1
# 4       B          4
# 7       C          7

df2 <- merge(df,base_sales,by="Product")
df2$adj_Sales <- df2$Sales / df2$Sales_2000

print(df2)
#   Product Year Sales Sales_2000 adj_Sales
# 1       A 2000     1          1    1.0000
# 2       A 2001     2          1    2.0000
# 3       A 2002     3          1    3.0000
# 4       B 2000     4          4    1.0000
# 5       B 2001     5          4    1.2500
# 6       B 2002     6          4    1.5000
# 7       C 2000     7          7    1.0000
# 8       C 2001     8          7    1.1429
# 9       C 2002     9          7    1.2857

有沒有辦法使用plyr或dplyr一次完成所有操作?

我們可以使用dplyr mutate直接創建列。

library(dplyr)
df %>% 
   group_by(Product) %>% 
   mutate(Sales_2000= Sales[Year==2000], adj_sales=Sales/Sales_2000)
#   Product Year Sales Sales_2000 adj_sales
#1       A 2000     1          1  1.000000
#2       A 2001     2          1  2.000000
#3       A 2002     3          1  3.000000
#4       B 2000     4          4  1.000000
#5       B 2001     5          4  1.250000
#6       B 2002     6          4  1.500000
#7       C 2000     7          7  1.000000
#8       C 2001     8          7  1.142857
#9       C 2002     9          7  1.285714

或使用data.table

library(data.table)
setDT(df)[, c('Sales_2000', 'adj_sales') := {tmp=Sales[Year==2000]
               list(tmp, Sales/tmp)}, by =  Product]
#   Product Year Sales Sales_2000 adj_sales
#1:       A 2000     1          1  1.000000
#2:       A 2001     2          1  2.000000
#3:       A 2002     3          1  3.000000
#4:       B 2000     4          4  1.000000
#5:       B 2001     5          4  1.250000
#6:       B 2002     6          4  1.500000
#7:       C 2000     7          7  1.000000
#8:       C 2001     8          7  1.142857
#9:       C 2002     9          7  1.285714

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM