获得R中因子中最常见的元素

arj*_*010 4 string r frequency

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

mySet<-c("abc","abc","def","abc","def","efg","abc")
Run Code Online (Sandbox Code Playgroud)

我想获得在该集合中出现最大次数的字符串(在这种情况下为"abc").

我理解一种方法是使用hist()但我面临数据类型问题,因为我是RI的新手并不能自己解决这个问题.

A5C*_*2T1 12

根据数据的大小和执行此类练习的频率,您可能希望花一些时间编写更高效的函数.底层tabletabulate,它更快,因此可以导致如下功能:

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)]
}
Run Code Online (Sandbox Code Playgroud)

此功能还用于识别最大值的多个值.比较以下内容:

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
Run Code Online (Sandbox Code Playgroud)

在小矢量级别,此功能更有效.对于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
Run Code Online (Sandbox Code Playgroud)

我已经从基准测试中删除了@ 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
Run Code Online (Sandbox Code Playgroud)


Bro*_*ieG 5

sqibb的变化:

names(which.max(table(mySet)))
# [1] "abc"
Run Code Online (Sandbox Code Playgroud)