5

我想知道是否有任何简单的 R 命令或包都可以让我轻松地将变量添加到 data.frames,这些变量是这些变量的“差异”或随时间的变化。

如果我的数据如下所示:

set.seed(1)
MyData <- data.frame(Day=0:9 %% 5+1, 
                 Price=rpois(10,10),
                 Good=rep(c("apples","oranges"), each=5))
MyData

   Day Price    Good
1    1     8  apples
2    2    10  apples
3    3     7  apples
4    4    11  apples
5    5    14  apples
6    1    12 oranges
7    2    11 oranges
8    3     9 oranges
9    4    14 oranges
10   5    11 oranges

然后在对价格变量进行“一阶差分”之后,我的数据将如下所示。

   Day Price    Good P1d
1    1     8  apples  NA
2    2    10  apples   2
3    3     7  apples  -3
4    4    11  apples   4
5    5    14  apples   3
6    1    12 oranges  NA
7    2    11 oranges  -1
8    3     9 oranges  -2
9    4    14 oranges   5
10   5    11 oranges  -3
4

6 回答 6

10

大道

transform(MyData, P1d = ave(Price, Good, FUN = function(x) c(NA, diff(x))))

ave/gsubfn

最后一个解决方案可以fn$在 gsubfn 包中稍微缩短:

library(gsubfn)
transform(MyData, P1d = fn$ave(Price, Good, FUN = ~ c(NA, diff(x))))

dplyr

library(dplyr)

MyData %>% 
  group_by(Good) %>% 
  mutate(P1d = Price - lag(Price)) %>% 
  ungroup

数据表

library(data.table)

dt <- data.table(MyData)
dt[, P1d := c(NA, diff(Price)), by = Good]

更新

dplyr 现在使用%>%而不是%.%.

于 2014-03-24T13:11:15.827 回答
2

One can easily do it like this:

library(reshape2)
library(dplyr)

MyNewData <- 
 MyData %.%
 melt(id = c("Good", "Day")) %.%
 dcast(Day ~ Good) %.%
 mutate(apples  = apples - lag(apples),
     oranges = oranges - lag(oranges)) %.%
 melt(id = "Day", variable.name = "Good", value.name = "P1d") %.%
 merge(MyData) %.%
 arrange(Good, Day)

Regards

于 2014-03-24T10:19:58.447 回答
0

这就是我想出的。但它似乎至少没有效率:

MyData$P1d <- c(NA, MyData$Price[-1]-MyData$Price[-nrow(MyData)])
MyData$P1d[c(F,MyData$Good[-1]!=MyData$Good[-nrow(MyData)])] <- NA

MyData

   Day Price    Good P1d
1    1     8  apples  NA
2    2    10  apples   2
3    3     7  apples  -3
4    4    11  apples   4
5    5    14  apples   3
6    1    12 oranges  NA
7    2    11 oranges  -1
8    3     9 oranges  -2
9    4    14 oranges   5
10   5    11 oranges  -3
于 2014-03-21T11:55:32.593 回答
0

我在一些 dpylr 在线教程之后想出了这段代码:我的目标是添加新列,即公司(标识符 GVKEY)的研发(变量 xrd)的 5 年增长率。RandD2015 是原始数据文件。

通过使用管道函数 (%>%),您可以在 dplyr 中组合多个调用。希望这很有用(我在 Stack Overflow 中的第一个代码贡献)

library(dplyr)

RandDtest<- RandDec2015 %>% 
    group_by(GVKEY) %>%
    mutate(xrd5yr=xrd/lag(xrd,4)-1)
于 2015-12-19T19:52:42.100 回答
0

就我而言,我必须为面板生成第一个差异。为了使差分向量具有相同的长度,我使用了带有 NA 的 diff。

library(dplyr)
mydata %>%
group_by(id) %>%
mutate(price_diff = c(NA, diff(price)))%>%
ungroup()
于 2020-05-06T08:42:04.333 回答
0

collapse::fdiff是您正在寻找的功能:

library(collapse)
# This means compute difference of Price lagged once, iterated once, by Good, ordered by Day
settransform(MyData, P1d = fdiff(Price, 1, 1, Good, Day))
于 2020-09-01T22:19:34.897 回答