【发布时间】:2021-01-09 14:23:35
【问题描述】:
我有 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
【问题讨论】:
我有 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 除以每个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 做到这一点:
library(data.table)
setDT(df)[order(city, hour), value := value/shift(value), city]
na.omit(df)
【讨论】: