【问题标题】:R No Mode and Exclude NAR 无模式并排除 NA
【发布时间】:2019-10-26 09:47:04
【问题描述】:

我正在寻找可用于 dplyr 的 R 模式函数。我看到的两个帖子对“关系”的处理方式非常不同。 This post (Ken Williams) 通过选择一组模式中最先出现的值来处理平局。 This post 通过记录同一单元格中的两个值来处理平局。

我正在寻找一个将领带视为 NA 并排除缺失值的模式函数。我使用Gregor's post 将领带视为不适用,但我似乎无法排除缺失值。

变量 DF$Color 是一个字符类型。

这是一个 DF 示例

Category<-c("A","B","B","C","A","A","A","B","C","B","C","C", "D", "D")
Color<-c("Red","Blue","Yellow","Blue","Green","Blue","Green","Yellow","Blue","Red","Red","Red","Yellow", NA)
DF<-data.frame(Category,Color)
DF <- arrange(DF, Category)
DF
DF$Color <- as.character(DF$Color)

包含 NA 后,代码如下:

 mode <- function(x) {
  ux <- unique(x)
  tx <- tabulate(match(x, ux))
  if(length(unique(tx)) == 1) {
    return(NA)
  }
  max_tx <- tx == max(tx)
  return(ux[max_tx])
}

    DF %>%
      group_by(Category) %>%
      summarise(Mode = mode(Color))

我正在尝试找出排除 NA 的代码。 df 看起来像:

  Category Mode  
  <fct>    <fct> 
1 A        Green 
2 B        Yellow
3 C        NA    
4 D        Yellow

【问题讨论】:

  • 嗯,实际上我提供的代码似乎不适用于字符类型。
  • 请参阅下面我的答案的编辑。它应该适用于字符和数字输入。

标签: r mode


【解决方案1】:

对函数的以下更改可确保根据输入返回正确类型的 NA 值,并且它适用于长度为 1 的向量。

mode <- function(x) {
  ux <- unique(na.omit(x))
  tx <- tabulate(match(x, ux))
  if(length(ux) != 1 & sum(max(tx) == tx) > 1) {
    if (is.character(ux)) return(NA_character_) else return(NA_real_)
  }
  max_tx <- tx == max(tx)
  return(ux[max_tx])
}

DF %>%
  group_by(Category) %>%
  summarise(Mode = mode(Color))

# A tibble: 4 x 2
  Category Mode  
  <fct>    <chr> 
1 A        Green 
2 B        Yellow
3 C        NA    
4 D        Yellow

【讨论】:

  • 这是完美的。我还在 dplyr 上用 3 个分组条件测试了这 600 万行。谢谢!
猜你喜欢
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 2016-05-12
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
相关资源
最近更新 更多