首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用rollapply()查找模式值

使用rollapply()查找模式值
EN

Stack Overflow用户
提问于 2014-11-08 05:37:36
回答 1查看 149关注 0票数 0

我已经得到了面板数据,并且一直在尝试k-means聚类。现在我得到了一组基本稳定的因子值,但我想把它弄得更平滑一些,例如,数据显示“怀俄明州早些年在第1组,进入第2组,然后进入第5组”,而不是“怀俄明州在第1,1,1,2,3,2,2,5,5”组。

因此,我采用的方法是使用rollapply()来计算模式值。下面是计算模式的代码(" mode ()"),以及一个包装器("ModeR()"),它(可能笨拙地)通过随机选择一种模式来解决多模式窗口的问题。这一切都很好,但是当我把它放到rollapply()中时,我就遇到了问题。

代码语言:javascript
复制
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"))

返回:

代码语言:javascript
复制
      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

请比较以下内容:

代码语言:javascript
复制
> ModeR(temp[1:5])
[1] 5
Levels: 5 6 7
> ModeR(temp[2:6])
[1] 6
Levels: 5 6 7

因此,问题似乎出在如何在rollapply()中应用ModeR。有什么想法吗?

谢谢!瑞克

EN

回答 1

Stack Overflow用户

发布于 2014-11-08 06:44:46

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

如上所述,ModeR()返回一个因子(就像Mode()一样)。我需要它是一个数字。我可以通过更新代码来修复这个问题,如下所示:

代码语言:javascript
复制
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()位(否则它会将数字向下舍入)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26810485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档