【问题标题】:Error from rollingmedian using columns使用列的滚动中位数错误
【发布时间】:2016-07-28 16:59:51
【问题描述】:

我有一个数据框,我尝试为其添加额外的列来计算当前和前 2 个值的中值。

Date         Value
21/07/2016  14.8
22/07/2016  14.9
23/07/2016  15.8
24/07/2016  15.0
25/07/2016  15.7
26/07/2016  15.6
27/07/2016  16.1
28/07/2016  16.1

我使用了以下代码:

library(zoo)
dataframe$medianval <-rollmedian(dataframe$Value,k=3)

我收到以下错误

> Error: k <= n is not TRUE

有什么建议吗?

【问题讨论】:

    标签: r median


    【解决方案1】:

    想想 R 在这里试图做什么。数据框有8 行,但要附加的向量只有6 元素。这些元素应该与哪些行对齐? R 应该在另外两个位置放什么?

    library(zoo)
    dataframe <- read.table(text="Date         Value
    21/07/2016  14.8
    22/07/2016  14.9
    23/07/2016  15.8
    24/07/2016  15.0
    25/07/2016  15.7
    26/07/2016  15.6
    27/07/2016  16.1
    28/07/2016  16.1", header=TRUE)
    rollmedian(dataframe$Value,k=3)
    # [1] 14.9 15.0 15.7 15.6 15.7 16.1
    nrow(dataframe)                          # [1] 8
    length(rollmedian(dataframe$Value,k=3))  # [1] 6
    

    因为我能猜到你的意思(如果我错了,请纠正我),我会尝试:

    dataframe$medianval <- c(NA, NA, rollmedian(dataframe$Value,k=3))
    dataframe
    #         Date Value medianval
    # 1 21/07/2016  14.8        NA
    # 2 22/07/2016  14.9        NA
    # 3 23/07/2016  15.8      14.9
    # 4 24/07/2016  15.0      15.0
    # 5 25/07/2016  15.7      15.7
    # 6 26/07/2016  15.6      15.6
    # 7 27/07/2016  16.1      15.7
    # 8 28/07/2016  16.1      16.1
    

    如果你希望能够方便地适应这个,你应该写一个简单的函数:

    med.fun <- function(var, data, k){
      # Note: variable name must be in quotes
      return(c(rep(NA, k-1), with(data, rollmedian(get(var), k=k))))
    }
    med.fun("Value", dataframe, 5)
    # [1]   NA   NA   NA   NA 15.0 15.6 15.7 15.7
    

    【讨论】:

    • 非常感谢您的帮助和澄清。是否会有与 c(NA, NA,... 不同的方式,例如,如果我想运行一个循环测试不同的中值长度?
    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2019-05-24
    相关资源
    最近更新 更多