[英]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
以下代碼可以工作,但由於它不是很優雅:
base_sales
), base_sales
)和原始數據幀( df
)合並使用, Sales
列重命名為Sales_2000
, 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.