【问题标题】:aggregation of categorical variables分类变量的聚合
【发布时间】:2019-01-03 08:49:56
【问题描述】:

我想聚合我的数据库,包括分类变量,以便每一行代表原始数据中的多行(例如,基于学生 ID)。每列都需要保存原始数据中最常见的值(每个聚合 ID)。 示例:我想按学生汇总我的数据并查看我的分类变量的最频繁级别 - 例如:

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

我正在与 R 工作室合作

【问题讨论】:

  • 我认为这就是您所要求的,假设您的数据存储在数据框 mydf: table(mydf\$student, mydf$class) 中。但是,从您的问题中仍然不能完全清楚您是要获取表格还是为每个独特的学生获取最流行的课程。
  • 感谢您的回答。我实际上的目标是为每个独特的学生获得一个最流行的课程!
  • 我实际上的目标是为每个独特的学生获得一个具有最流行课程的 df!有什么帮助吗?
  • 我建议在标签中添加“r”以增加吸引力;)

标签: aggregation


【解决方案1】:

如果实际上您希望创建一个新的数据框,将多个学生聚合(或在dplyr 中汇总)到每个学生的一行中,其中您指定的分类列将包含最常见的值,您可以使用 @来自DescTools 库的987654322@ 函数,以及summarisedplyr。您应该注意,当您没有最常见的值或多个值(多模式)时,您可能会遇到麻烦,例如在您的示例数据中。你需要决定做什么。

这可以让你开始:

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

【讨论】:

  • 谢谢你!
  • 你保存了我的项目!
  • @F.Ha 很高兴我能帮上忙!如果您可以接受和/或投票赞成这个答案,我们将不胜感激:)
  • 我当然投了票,但我得到了这个:... 声望低于 15 人的投票会被记录,但不要更改公开显示的帖子分数。
  • @F.Ha 当然。我的意思是点击旁边的小V来接受答案,对不起:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2023-01-04
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
相关资源
最近更新 更多