我有兴趣在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
答案 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) )