按第一个时期的值标准化时间序列的最优雅方法是什么?

时间:2015-06-06 18:55:40

标签: r

我有一个按产品和年份销售的数据框,并希望创建一个列,将每个产品年份除以2000年的销售额(按产品分开),以创建“调整后的销售额”({{ 1}})。

adj_Sales

以下代码有效,但不是很优雅,因为它:

  • a)创建一个中间数据框(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 ),
  • b)使用与中间数据框(base_sales)和原始(base_sales)的合并,
  • c)需要一步将df列重命名为Sales
  • d)创建了一个不受欢迎的Sales_2000列,

有没有办法使用plyr或dplyr一次完成所有这些?

Sales_2000

有没有办法使用plyr或dplyr一次完成所有这些?

1 个答案:

答案 0 :(得分:2)

我们可以使用dplyr中的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

{{1}}