获取 R 中某个因子中出现次数最多的元素

2023-12-29

我在 R 变量中有一组字符串,当我检查类时,它说它是一个因素。 例如。

mySet<-c("abc","abc","def","abc","def","efg","abc")

我想获取该集合中出现次数最多的字符串(即本例中的“abc”)。

我理解一种方法是使用hist()但我面临着数据类型问题,而且由于我是 R 新手,我无法自己解决这个问题。


根据数据的大小和进行此类练习的频率,您可能需要花一些时间编写更高效的函数。潜在的table is tabulate,速度要快得多,因此可以得到如下所示的函数:

MaxTable <- function(InVec, mult = FALSE) {
  if (!is.factor(InVec)) InVec <- factor(InVec)
  A <- tabulate(InVec)
  if (isTRUE(mult)) {
    levels(InVec)[A == max(A)]
  } 
  else levels(InVec)[which.max(A)]
}

此函数还设计用于识别何时存在多个最大值。比较以下内容:

mySet <- c("A", "A", "A", "B", "B", "B", "C", "C")
## Your question indicates that you have factors,
##   but your sample code is a character vector
mySetF <- factor(mySet) ## Just as an example

## @BrodieG's answer
fun1 <- function(InVec) {
  names(which.max(table(InVec)))
}

## @sgibb's answer
fun2 <- function(InVec) {
  m <- which.max(table(as.character(InVec)))
  as.character(InVec)[m]
}

fun1(mySet)
# [1] "A"
fun2(mySet)
# [1] "A"
MaxTable(mySet)
# [1] "A"
MaxTable(mySet, mult = TRUE)
# [1] "A" "B"

library(microbenchmark)    
microbenchmark(fun1(mySet), fun2(mySet), MaxTable(mySet), MaxTable(mySetF))
# Unit: microseconds
#              expr     min       lq   median       uq      max neval
#       fun1(mySet) 291.457 297.1845 302.2080 313.1235 3008.108   100
#       fun2(mySet) 296.388 302.0775 311.3170 321.5260 1367.137   100
#   MaxTable(mySet) 172.463 180.8755 184.8355 189.9700 1947.700   100
#  MaxTable(mySetF)  34.510  38.1545  44.6045  46.6695   95.341   100

在小向量级别上,该函数效率更高。这一点在以下情况下更加明显:factor向量。更大的向量怎么样?

set.seed(1)
medSet <- sample(c(LETTERS, letters), 1e5, TRUE)
medSetF <- factor(medSet)

fun1(medSet)
# [1] "E"
fun2(medSet) ### Wrong Answer!!!
# [1] "D"
MaxTable(medSet)
# [1] "E"

microbenchmark(fun1(medSet), MaxTable(medSet), MaxTable(medSetF))
# Unit: microseconds
#               expr       min        lq     median        uq       max neval
#       fun1(medSet) 14222.846 14350.957 14484.4490 14600.490 34810.174   100
#   MaxTable(medSet)  7787.761  7860.248  7917.3455  8019.068  9762.884   100
#  MaxTable(medSetF)   501.733   529.257   570.0735   587.936  1469.994   100

我已经从基准测试中删除了 @sgibb 的函数(它的运行时间与fun1())因为它返回错误的答案。

最后一个基准......

set.seed(3)
bigSet <- sample(c(LETTERS, letters), 1e7, TRUE)
bigSetF <- factor(bigSet)
microbenchmark(fun1(bigSet), MaxTable(bigSet), MaxTable(bigSetF), times = 10)
# Unit: milliseconds
#               expr        min         lq     median         uq        max neval
#       fun1(bigSet) 1519.37503 1612.10290 1648.36473 1789.02965 1932.41073    10
#   MaxTable(bigSet)  782.01856  791.86408  834.35764  894.60535 1019.28747    10
#  MaxTable(bigSetF)   48.56459   48.76492   49.25444   49.93911   50.20404    10
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 R 中某个因子中出现次数最多的元素 的相关文章

随机推荐

  • grunt 执行停止批处理脚本

    我正在使用 cordova 和 yeoman angularjs 进行开发 我采用了如下的文件夹结构 在Windows上dir命令的输出 C code cordova pg droid app gt dir Volume in drive
  • 在 libgdx 中加载大背景的最佳方法

    我正在使用 libgdx 开发游戏 现在我想在我的地图上有一个背景 地图大小尚未固定 但我稍后会决定 我的地图是基于图块的 但我不使用 TiledMaps 所以我用自己的代码 编辑器创建并加载地图 我现在的问题是 我应该如何实现后台的东西
  • 在 Ansible 角色任务文件中使用 YAML 锚点

    我正在尝试创建一个 ansible 角色任务文件 其中包含多个重复部分 并且我想利用 YAML 的锚点功能 该功能允许跨文件共享数据 在我的实际文件中 我有 3 或 4 个属性需要在文件中的十几个任务中完全相同 因此锚点似乎是完美的解决方案
  • 使用 InputField 时隐藏虚拟键盘

    我知道如何使用隐藏或显示虚拟键盘InputMethodManager 但我想输入文字EditText使用物理键盘 但我不想在 Unity 3D Android 中显示虚拟键盘 我怎样才能在 Unity 3D 中做到这一点 不存在这样的事情E
  • 如何在 Cloud Dataflow 中使用 TextIO.Read 将多个文件与名称进行匹配

    我有一个 gcs 文件夹 如下所示 gs
  • 在 Swift 中,仅在对象的生命周期内调用一次方法

    假设我们覆盖scrollViewDidScroll方法和第一次滚动only 我们想doSomething 实现这一点的一个简单方法是拥有一个实例级布尔变量并切换 检查它 func scrollViewDidScroll scrollView
  • Dojo:在 required=false 时为 FilteringSelect 选择空值

    请看一下这段代码 dojo require dijit form FilteringSelect dojo require dojo store JsonRest dojo declare JsonFilteringSelect dijit
  • 结账时修改 Shopify 运费

    Is there a possibility that we could add a custom shipping price at checkout through an API call or script 我想根据一些规则修改价格
  • Array.isDefinedAt 用于 scala 中的 n 维数组

    有没有一种优雅的表达方式 val a Array fill 2 10 1 def do to elt i Int j Int if a isDefinedAt i a i isDefinedAt j f a i j 在斯卡拉 我建议您不要将
  • OpenXML - SpreadsheetReader 在当前上下文中不存在

    所以我试图复制这个答案使用 Openxml 2 0 在 Excel 中获取单元格背景颜色 https stackoverflow com questions 10756206 getting cell backgroundcolor in
  • 许可检查器的“已激活”状态的寿命。对于用户来说,多频繁才算过多?

    我的应用程序是一种袖珍指南 包含全年的一些数据 我假设用户将至少使用该程序一次并通过互联网访问来激活许可证 或者至少这是我对 Android 许可系统如何工作的理解 我正在使用服务器管理策略 它会定期检查许可证吗 有什么办法可以控制这个吗
  • 将 docker 卷挂载到 Windows 主机

    我正在我的 Windows 10 机器上运行 docker for windows 使用 hyper v 如果我运行以下命令 docker volume create test docker volume inspect test I ge
  • MongoDb 中的 $push 不起作用?

    我的架构如下所示 var exampleSchema newSchema profile experience exp String 这是更新个人资料收集中的经验的代码 exampleSchema statics experience fu
  • 如何在anjuta项目中包含资源文件

    我正在尝试更新 vala 中的图形项目 将大量代码行移动到 ui 文件中 我想使用模板 可用于 glib 2 38 和 GTK 3 8 类似的东西 我的项目是用 Anjuta 和 autoconf 管理的 In the src目录有 app
  • 如何在 PHP 中进行 URL 重写?

    我正在尝试在我的 PHP 应用程序中实现 URL 重写 有人可以分享一下在 PHP 和 MySQL 中实现 URL 重写的分步过程吗 在我的应用程序中 我想实现以下 URL 重写 我想重定向 1 http example com video
  • Firefox ... SVG ... 下划线...天哪?

    到目前为止 我尝试的任何方法都无法让 Firefox 在某些文本下划线 根据谷歌的结果 这个问题已知并记录了五年多 这不可能是真的 发生了什么事 有人知道任何持续有效的解决方法 甚至可能知道他们为什么还没有修复它的原因 我对此很好奇 Fir
  • OCaml:模式匹配与 If/else 语句

    因此 我对 OCaml 完全陌生 并且在实现第一个功能方面进展相当缓慢 我无法理解的一件事是何时使用模式匹配功能 例如 let foo gt true gt false 与使用 if else 结构类似 let foo a if a the
  • 如何在部署时在Heroku中自定义pip的requirements.txt?

    我正在将 Python Django 应用程序部署到 Heroku 并且仅当部署到 Heroku 等某些环境时 我才想自定义requirements txt 文件 通过添加 git 支持的依赖项和密码 我很想将其设置在环境变量或其他变量中
  • 在模板类实现中使用struct template

    我正在尝试学习 C 中的模板用法 我创建了一个结构节点 在队列类实现中使用它 但出现编译器错误 错误 成员函数 bool MyQueue add T data 中 qnode 之前的预期类型说明符 include
  • 获取 R 中某个因子中出现次数最多的元素

    我在 R 变量中有一组字符串 当我检查类时 它说它是一个因素 例如 mySet lt c abc abc def abc def efg abc 我想获取该集合中出现次数最多的字符串 即本例中的 abc 我理解一种方法是使用hist 但我面