对zoo对象中的新变量进行mutate

时间:2016-11-19 19:45:05

标签: r matrix dplyr zoo

我有兴趣在zoo对象中计算一些新变量。我喜欢dplyr - mutate - 方式,但我无法弄清楚如何在zoo对象中 mutate 。如果我使用transform,我似乎仅限于计算对象中已存在的变量。我显然可以在不同的步骤中完成它,但我想在我可能忽略的zoo对象中有一些方便的工作方式吗?我看了this answer,这启发了我的问题,this question,但他们都没有解决我的具体问题。

以下是一些代码,展示了我想要做的事情,

df <- data.frame(dta=paste0("2016-11-", 19:24), a = 3:8, b = 9:14)

# install.packages(c("dplyr"), dependencies = TRUE)  
library(dplyr)
df %>%
   mutate(c = log(a) * log(b),
          dc = c - lag(c, 1)
          )
#          dta a  b        c        dc
# 1 2016-11-19 3  9 2.413898        NA
# 2 2016-11-20 4 10 3.192061 0.7781628
# 3 2016-11-21 5 11 3.859264 0.6672028
# 4 2016-11-22 6 12 4.452355 0.5930915
# 5 2016-11-23 7 13 4.991161 0.5388060
# 6 2016-11-24 8 14 5.487765 0.4966045

# install.packages(c("zoo"), dependencies = TRUE)
library(zoo)
df.z <- read.zoo(df)

# install.packages(c("magrittr"), dependencies = TRUE)  
library(magrittr)
df.z %>% transform(c = log(a) * log(b), dc = c - lag(c, 1))
# Error in x[seq_len(xlen - n)] : 
#   object of type 'builtin' is not subsettable

# the clumsy workaround
df.z.1 <- df.z   %>% transform(c = log(a) * log(b))
df.z.2 <- df.z.1 %>% transform(dc = c - lag(c, 1))
df.z.2
#            a  b        c        dc
# 2016-11-19 3  9 2.413898        NA
# 2016-11-20 4 10 3.192061 0.7781628
# 2016-11-21 5 11 3.859264 0.6672028
# 2016-11-22 6 12 4.452355 0.5930915
# 2016-11-23 7 13 4.991161 0.5388060
# 2016-11-24 8 14 5.487765 0.4966045

1 个答案:

答案 0 :(得分:1)

您获得的错误来自正在创建的'c' - 列与c - 函数之间的模糊性,该函数是&#34;内置&#34 ;由错误功能引用。您可以通过这种单线程获得成功(这是您对单个转换调用的期望与您不希望的两步过程之间的中途:

> df.z %>% transform('c' = log(a) * log(b) ) %>% transform(dc = c - lag(c, 1))
           a  b        c        dc
2016-11-19 3  9 2.413898        NA
2016-11-20 4 10 3.192061 0.7781628
2016-11-21 5 11 3.859264 0.6672028
2016-11-22 6 12 4.452355 0.5930915
2016-11-23 7 13 4.991161 0.5388060
2016-11-24 8 14 5.487765 0.4966045

实验表明第一次&#34;转换的结果&#34;在第一次转换调用中无法继续使用。我也尝试在动物园对象和变换调用之间滑动对... %>% coredata ...的调用,但是在矩阵对象上也没有明显的变异方法。这有效,但似乎是向后退一步:

df.z %>% coredata %>% as.data.frame %>% 
                        mutate('c' = log(a) * log(b), dc = c- lag(c,1)  )