将每行除以R中的上一行

问题描述

我有 R个数据框

   city hour value
0   NY  0   12
1   NY  12  24
2   LA  0   3
3   LA  12  9

对于每个城市,我希望将每行除以上一行并将结果写入新的数据框中。所需的输出是:

city ratio
NY   2
LA   3

解决方法

您可以像下面一样尝试aggregate

aggregate(value ~city,df,function(x) x[-1]/x[1])

给出

  city value
1   LA     3
2   NY     2

数据

> dput(df)
structure(list(city = c("NY","NY","LA","LA"),hour = c(0L,12L,0L,12L),value = c(12L,24L,3L,9L)),class = "data.frame",row.names = c("0","1","2","3"))
,

您可以使用lag获取先前的值,将每个value的{​​{1}}除以先前的值,然后删除city行。

NA

library(dplyr) df %>% arrange(city,hour) %>% group_by(city) %>% summarise(value = value/lag(value)) %>% na.omit() # city value # <chr> <dbl> #1 LA 3 #2 NY 2 中,我们可以通过data.table进行此操作:

shift