Выберите имя определенного значения в таблице (например, max)

У меня есть вектор чисел. Назовем его mydata:

str(mydata)
# num [1:236] 2 1 1 2 2 1 2 1 2 2 ...

Затем я могу подсчитать каждое значение, используя table:

table(mydata)
# mydata
#  1    2    9  10 
# 20  200   14   2

Теперь я хочу выбрать значение с наибольшим количеством (в данном случае «2»).

Я могу найти наибольшее количество (например, 200 в данном случае), используя функцию max: max(table(mydata)). Но как получить имя, связанное с максимальным количеством в таблице, т. е. "2"?


person William Oliver    schedule 09.05.2014    source источник
comment
если tab это ваш стол names(tab)[tab==max(tab)]   -  person user20650    schedule 09.05.2014
comment
which.max тоже удобно   -  person Gary Weissman    schedule 09.05.2014
comment
Спасибо всем, кто ответил - все упомянутые варианты работают! Это было именно то, что я не мог понять. Я также не очень хорошо разбираюсь в stackflow, но если есть флаг Solved, который необходимо установить, я был бы рад это сделать.   -  person William Oliver    schedule 09.05.2014
comment
@Уильям Оливер; вы можете нажать на галочку рядом с ответом, который (лучше всего) решил ваш вопрос [вы также можете нажать на стрелку вверх, если вы нашли один / оба ответа полезными]   -  person user20650    schedule 09.05.2014
comment
Спасибо. У меня видимо не хватает репутации для апклика. Я прошу прощения у MrFlick (а также у пользователя 20650 и мистера Вайсмана) за то, что смог выбрать только один из очень полезных ответов.   -  person William Oliver    schedule 09.05.2014


Ответы (2)


table очень похож на список или фрейм данных в том смысле, что он имеет значения и имена (атрибуты), которые доступны через векторное подмножество.

> mydata <- c(rep(1, 20), rep(2, 200), rep(9, 14), rep(10, 2))
> tab <- table(mydata)
> tab
## mydata
##   1   2   9  10 
##  20 200  14   2
> names(tab)
## [1] "1"  "2"  "9"  "10" 
> c(val = names(tab)[tab == max(tab)], freq = max(tab))
##  val  freq 
##  "2" "200"

Следующие эквивалентны

> tab[ names(tab)[tab == max(tab)] ]
##   2 
## 200
> tab["2"]
##   2
## 200

Другие полезные сведения об объекте описаны в его attributes

> attributes(tab)
$dim
[1] 4

$dimnames
$dimnames$mydata
[1] "1"  "2"  "9"  "10"

$class
[1] "table"
person Rich Scriven    schedule 09.05.2014

Я бы, наверное, сделал это

tab<-table(mydata)
names(tab)[which.max(tab)]

Это вернет «2» в виде строки. Вы можете сделать as.numeric(), если хотите вернуть его к числу. Эта однострочная строчка немного уродливее и, вероятно, менее эффективна, но, эй, это одна строчка.

sapply(list(table(mydata)), function(x) names(x[which.max(x)]))

или, может быть

with(as.data.frame(table(data)), data[which.max(Freq)])

который фактически вернет коэффициент со значением «2». Если вы хотите сделать это числовым, вам нужно сделать as.numeric(as.character(x)). Я просто пытался найти способы избежать лежания табличной переменной, если она мне действительно не нужна. Хотелось бы, чтобы был более простой способ преобразовать таблицу в именованный вектор.

person MrFlick    schedule 09.05.2014