计算具有许多独立组的数据帧中的组和子群的比率

  • 本文关键字:比率 计算 许多 独立 数据帧 r
  • 更新时间 :
  • 英文 :


我想知道是否有一种简单的方法(不使用循环(来计算组(材料编号(和子组(日期(的比率。例如,我有:

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创建的逻辑组。如果你不写,你可能会在未来的分析步骤中遇到麻烦。

最新更新