R 在zoo对象内的新变量上进行变异

R 在zoo对象内的新变量上进行变异,r,matrix,dplyr,zoo,R,Matrix,Dplyr,Zoo,我想计算zoo对象中的一些新变量。我喜欢dplyr-mutate-方式,但我不知道如何在zoo对象中进行变异。如果我使用transform,我似乎只限于计算对象内部已经存在的变量。很明显,我可以分步完成,但我想在zoo对象中有一些简便的方法我可能忽略了?我看了一下,这激发了我的问题,但他们都没有解决我的具体问题 下面是一些代码,演示我想做什么 df <- data.frame(dta=paste0("2016-11-", 19:24), a = 3:8, b = 9:14) # inst

我想计算
zoo
对象中的一些新变量。我喜欢
dplyr
-
mutate
-方式,但我不知道如何在
zoo
对象中进行变异。如果我使用
transform
,我似乎只限于计算对象内部已经存在的变量。很明显,我可以分步完成,但我想在
zoo
对象中有一些简便的方法我可能忽略了?我看了一下,这激发了我的问题,但他们都没有解决我的具体问题

下面是一些代码,演示我想做什么

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
df%
变异(c=log(a)*log(b),
dc=c-滞后(c,1)
)
#dta b c dc
#1 2016-11-19 3 9 2.413898北美
# 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)
图书馆(动物园)
df.z%变换(c=log(a)*log(b),dc=c-滞后(c,1))
#x中的错误[顺序(xlen-n)]:
#类型为“builtin”的对象不可子集
#笨拙的变通办法
df.z.1%变换(c=log(a)*log(b))
df.z.2%变换(dc=c-滞后(c,1))
df.z.2
#a、b、c、dc
#2016-11-19 392.413898北美
# 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

您得到的错误来自正在创建的
'c'
-列与
c
-函数之间的歧义,后者是错误函数引用的“内置”函数。您可以使用这一行代码获得成功(它介于您对单个转换调用的渴望和不希望的两步过程之间:

> 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
实验表明,第一次“改造”的结果无法在第一次转换调用中进一步使用。我也尝试在zoo对象和转换调用之间滑动对
..%>%coredata…
的调用,但显然也没有在矩阵对象上进行变异的方法。这很有效,但似乎是一种倒退:

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

您好,
zoo
使用内部
matrix
存储数据,因此可能您可以在
matrix
中将您的问题定义为
mutate
,以获得更广泛的受众。我想您希望上面介绍的第一个备选方案。第二个方案失去索引。同意。我刚才介绍它是为了证明“分离”是可能的动物园对象。
transform
函数似乎更通用,尽管
mutate
-函数具有模式紧凑的语义。仅针对此问题。如果问题是交换两列,那么
transform
很容易做到,但它根本不清楚如何使用
mutate
。例如,使用内置的
BOD数据帧:
transform(BOD,demand=Time,Time=demand)
进行交换,但这不适用于
mutate
。我们可以想出许多类似的例子。