агрегация категориальных переменных - PullRequest
0 голосов
/ 02 января 2019

Я хочу объединить свою базу данных, включая категориальные переменные, чтобы каждая строка представляла несколько строк из исходных данных (например, на основе идентификатора студента). Каждый столбец должен содержать наиболее распространенное значение в исходных данных (для агрегированного идентификатора). Пример: я хочу объединить свои данные по учащемуся и увидеть самый частый уровень моих категориальных переменных - например:

student   class 
a          h        (being h the dominant level for the variable "class"

Я работаю с R studio

enter image description here

1 Ответ

0 голосов
/ 02 января 2019

Если на самом деле вы хотите создать новый фрейм данных, который объединяет (или суммирует в dplyr) несколько учащихся в одну строку на каждого учащегося, в которой указанные столбцы категорий будут содержать наиболее распространенное значение, вы можете использовать * Функция 1002 * из библиотеки DescTools и summarise с dplyr. Вы должны заметить, что вы можете столкнуться с проблемами, как в ваших примерах данных, когда у вас нет или несколько значений, которые являются наиболее распространенными (мультимодальные). Вам нужно будет решить, что делать.

Это может помочь вам начать:

install.packages("dplyr")
library(dplyr)
install.packages("DescTools")
library(DescTools)

#create sample data tibble (similar to data frame)
data <- data.frame(student=c('a', 'a', 'a', 'b', 'c', 'c'),
               subject=c('aze','sdf','hjk','uio','okn','uhv'),
               class=c('h','h','f','l','h','l'),
               num=c(2,2,3,5,2,6))


# returns a single mode. Will return NA if multimodal by default.
# To return the first mode if multimodal, add "FALSE" to the second condition
get_mode = function(x, multimodal.na="TRUE"){
  modes <- Mode(x)
  if (multimodal.na=="FALSE" | length(modes)==1) {
    return(modes[1]) 
  } else {
    return(modes[length(modes)+1])
  }
}

# tests
data_mode <- data %>% group_by(student) %>% summarise(md_subject = get_mode(subject, multimodal.na = "FALSE"),
                                                      md_class = get_mode(class, multimodal.na = "FALSE"),
                                                      md_num = get_mode(num, multimodal.na = "FALSE"))
data_mode2 <- data %>% group_by(student) %>% summarise(md_subject = get_mode(subject),
                                                      md_class = get_mode(class),
                                                      md_num = get_mode(num))

Теперь давайте рассмотрим два вышеупомянутых элемента:

> data_mode
# A tibble: 3 x 4
  student md_subject md_class md_num
  <fct>   <chr>      <chr>     <dbl>
1 a       aze        h             2
2 b       uio        l             5
3 c       okn        h             2
> data_mode2
# A tibble: 3 x 4
  student md_subject md_class md_num
  <fct>   <chr>      <chr>     <dbl>
1 a       NA         h             2
2 b       uio        l             5
3 c       NA         NA           NA
...