R Нет режима и исключить NA - PullRequest
0 голосов
/ 12 июня 2019

Я ищу функцию режима в R, которую я могу использовать для dplyr.Два поста, которые я видел, трактуют «галстуки» совсем по-другому. Этот пост (Кен Уильямс) рассматривает связи, выбирая первое появившееся значение из набора режимов. Этот пост рассматривает связи, отмечая оба значения в одной и той же ячейке.

Я ищу функцию режима, которая обрабатывает связи как NA и исключает пропущенные значения.Я использовал пост Грегора , чтобы рассматривать связи как NA, но я не могу исключить пропущенные значения.

Переменная 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

1 Ответ

2 голосов
/ 12 июня 2019

Следующие изменения в функции гарантируют, что правильный тип значения 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
...