【问题标题】:Using rollapply() to find modal value使用 rollapply() 查找模态值
【发布时间】:2014-11-07 21:37:36
【问题描述】:

我有面板数据,并且一直在玩 k-means 聚类。所以现在我有了一组大部分稳定的因子值,但我想更平滑一点,以便(例如)数据显示“怀俄明州早些年在第 1 组,移到第 2 组,然后进入第 5 组”,而不是“怀俄明州在第 1、1、1、2、3、2、2、5、5、5 组”。

所以我采用的方法是使用 rollapply() 来计算模态值。下面是用于计算模式(“Mode()”)的代码,以及(“ModeR()”)的包装器(可能笨拙地)通过随机选择模式来解决多模式窗口的问题。一切都很好,但是当我将它放入 rollapply() 时,我遇到了问题。

Mode <- function(vect){ # take a vector as input
  temp <- as.data.frame(table(vect)) 
  temp <- arrange(temp,desc(Freq)) # from dplyr
  max.f <- temp[1,2]
  temp <- filter(temp,Freq==max.f) # cut out anything that isn't modal
  return(temp[,1])
}
ModeR <- function(vect){
  out <- Mode(vect)
  return(out[round(runif(1,min=0.5000001,max=length(out)+0.499999999))])
}
temp <- round(runif(20,min=1,max=10)) # A vector to test this out on.
cbind(temp,rollapply(data=temp,width=5,FUN=ModeR,fill=NA,align="right"))

返回:

      temp   
 [1,]    5 NA
 [2,]    6 NA
 [3,]    5 NA
 [4,]    5 NA
 [5,]    7  1
 [6,]    6  1
 [7,]    5  1
 [8,]    5  1
 [9,]    3  2
[10,]    1  3
[11,]    5  3
[12,]    7  3
[13,]    5  3
[14,]    4  3
[15,]    3  3
[16,]    4  2
[17,]    8  2
[18,]    5  2
[19,]    6  3
[20,]    6  3

比较一下:

> ModeR(temp[1:5])
[1] 5
Levels: 5 6 7
> ModeR(temp[2:6])
[1] 6
Levels: 5 6 7

所以看起来问题在于如何在 rollapply() 中应用 ModeR。有什么想法吗?

谢谢! 瑞克

【问题讨论】:

    标签: r rollapply


    【解决方案1】:

    感谢/u/murgs!他的评论为我指明了正确的方向(除了帮助我使用 sample() 简化 ModeR())。

    上面写的

    ModeR() 返回一个因子(与 Mode() 一样)。我需要它是一个数字。我可以通过如下更新我的代码来解决这个问题:

    Mode <- function(vect){ # take a vector as input
      temp <- as.data.frame(table(vect)) 
      temp <- arrange(temp,desc(Freq))
      max.f <- temp[1,2]
      temp <- filter(temp,Freq==max.f) # cut out anything that isn't modal
      return(as.numeric(as.character(temp[,1]))) #HERE'S THE BIG CHANGE
    }
    ModeR <- function(vect){
      out <- Mode(vect)
      return(out[sample(1:length(out),1)]) #HERE'S SOME IMPROVED CODE!
    }
    

    现在 rollapply() 完成了我期望它做的事情!仍然有那个奇怪的 as.character() 位(否则它会将数字四舍五入)。我不确定那里发生了什么,但代码有效,所以我不用担心......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2012-08-22
      • 2018-03-18
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多