使用rollappy()查找模式值

使用rollappy()查找模式值,r,rollapply,R,Rollapply,我有面板数据,一直在玩k-means聚类。现在我得到了一组基本稳定的因子值,但我想稍微平滑一点,比如说数据显示怀俄明在前几年在第一组,进入第二组,然后进入第五组,而不是怀俄明在第1、1、1、2、3、2、2、5、5组 所以我采用的方法是使用rollapply来计算模态值。下面是用于计算模式的代码,以及该ModeR的包装器,它可能通过随机选择模式笨拙地解决了多模式窗口的问题。这一切都很好,但当我把它放入rollapply时,我遇到了问题 Mode <- function(vect){ # ta

我有面板数据,一直在玩k-means聚类。现在我得到了一组基本稳定的因子值,但我想稍微平滑一点,比如说数据显示怀俄明在前几年在第一组,进入第二组,然后进入第五组,而不是怀俄明在第1、1、1、2、3、2、2、5、5组

所以我采用的方法是使用rollapply来计算模态值。下面是用于计算模式的代码,以及该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"))
与之相比:

> ModeR(temp[1:5])
[1] 5
Levels: 5 6 7
> ModeR(temp[2:6])
[1] 6
Levels: 5 6 7
因此,问题似乎在于ModeR在rollapply中的应用方式。有什么想法吗

谢谢! 瑞克

谢谢你!他的评论为我指明了正确的方向,并帮助我使用示例简化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位,否则它会将数字舍入。我不确定那里发生了什么,但代码是有效的,所以我不会担心它

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!
}