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
。我们可以想出许多类似的例子。