将每一行除以前一行的R语言操作

3

我有一个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

请查看此答案 https://dev59.com/umUq5IYBdhLWcg3wN9wt - at80
2个回答

4
您可以使用lag函数获取每个city的前一个值,将每个value除以其前一个值,并删除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` 来实现这一点:
library(data.table)
setDT(df)[order(city, hour), value := value/shift(value), city]
na.omit(df)

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"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接