我有一个按产品和年份销售的数据框,并希望创建一个列,将每个产品年份除以2000年的销售额(按产品分开),以创建“调整后的销售额”({{ 1}})。
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
列,有没有办法使用plyr或dplyr一次完成所有这些?
Sales_2000
有没有办法使用plyr或dplyr一次完成所有这些?
答案 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}}