我想知道是否有一种简单的方法(不使用循环(来计算组(材料编号(和子组(日期(的比率。例如,我有:
Mat# Date Value
A 1/1/2010 2
B 1/1/2010 6
A 1/1/2008 4
C 1/1/2010 6
A 1/1/2020 2
B 1/1/2020 6
A 1/1/2021 4
C 1/1/2020 6
我想要:
Mat# Date Value Ratio
A 1/1/2010 2 N/a
A 1/1/2008 4 2
A 1/1/2020 2 0.5
A 1/1/2021 4 2
B 1/1/2010 6 N/A
B 1/1/2020 6 1
C 1/1/2010 6 N/A
C 1/1/2020 6 1
我目前使用的代码是:
lol = df%>%
arrange(df$materialNumber,df$EKPO_Price_Date) %>%
mutate(log10ratio = abs(log10(as.numeric(df$netPriceinPD) / lag(as.numeric(df$netPriceinPD)))))
忽略log10,相同的理论适用于
但目前使用该代码时,它对数据进行了正确的排序,但只计算了一次每个数据的比率,而忽略了子组。
我想确定df中该材料编号当前行的值与该材料编号当前行的前一值的比值(按材料编号和日期排列(
您可以尝试这种方式。您需要使用dplyr
动词group_by
:
library(dplyr)
df %>%
# covert to date
mutate(Date = as.Date(Date, format = "%d/%m/%Y")) %>%
arrange(Mat, Date) %>%
group_by(Mat) %>%
mutate(Ratio = Value / lag(Value)) %>%
ungroup()
#> # A tibble: 8 x 4
#> Mat Date Value Ratio
#> <chr> <date> <int> <dbl>
#> 1 A 2008-01-01 4 NA
#> 2 A 2010-01-01 2 0.5
#> 3 A 2020-01-01 2 1
#> 4 A 2021-01-01 4 2
#> 5 B 2010-01-01 6 NA
#> 6 B 2020-01-01 6 1
#> 7 C 2010-01-01 6 NA
#> 8 C 2020-01-01 6 1
在这种情况下,您需要使用ungroup
来删除使用group_by
创建的逻辑组。如果你不写,你可能会在未来的分析步骤中遇到麻烦。