【问题标题】:mutate on new variables inside zoo object对 zoo 对象内的新变量进行变异
【发布时间】:2016-11-19 19:45:04
【问题描述】:

我有兴趣在 zoo 对象中计算一些新变量。我喜欢dplyr-mutate-方式,但我不知道如何在zoo 对象内变异。如果我使用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

【问题讨论】:

  • 嗨,zoo 在内部使用 matrix 来存储数据,所以您可以在 matrix 中将您的问题定义为 mutate 以获得更广泛的受众。

标签: r matrix dplyr zoo


【解决方案1】:

您遇到的错误来自正在创建的'c'-column 与错误函数引用的“内置”c-function 之间的歧义。您可以通过这种单行方式获得成功(这介于您对单个转换调用的渴望和您不希望的两步过程之间:

> 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 对象和 transform 调用之间滑动对 ... %&gt;% coredata ... 的调用,但显然也没有对矩阵对象进行变异的方法。这可行,但似乎倒退了一步:

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

【讨论】:

  • 我认为您想要上面介绍的第一个替代方案。第二个丢失索引。
  • 同意。我只是展示它来证明可以“拆开”一个动物园对象。 transform 函数似乎更通用,尽管 mutate 函数具有模式紧凑语义。
  • 只针对这个问题。如果问题是交换两列,那么transform 很容易做到,但完全不清楚如何使用mutate 来做到这一点。例如,使用内置的BOD 数据框:transform(BOD, demand = Time, Time = demand) 进行交换,但不适用于mutate。可以想出很多类似的例子。
猜你喜欢
  • 2011-08-03
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 2016-01-16
  • 2020-05-27
相关资源
最近更新 更多