Как написать функцию для вычисления индекса H в R?

Я новичок в R и ищу вычисление индекса h.

Индекс H является популярным показателем для количественной оценки научной продуктивности. Формально, если f — это функция, соответствующая количеству цитирований каждой публикации, мы вычисляем индекс h следующим образом:

Сначала мы упорядочиваем значения f от наибольшего к наименьшему значению. Затем мы ищем последнюю позицию, в которой f больше или равно позиции (мы называем эту позицию h).

Например, если у нас есть исследователь с 5 публикациями A, B, C, D и E с 10, 8, 5, 4 и 3 цитированиями соответственно, индекс h равен 4, поскольку 4-я публикация имеет 4 цитирования. а у 5-го всего 3. Напротив, если те же публикации имеют 25, 8, 5, 3 и 3 цитирования, то индекс равен 3, потому что четвертая статья имеет только 3 цитирования.

Может ли кто-нибудь предложить более разумный способ решить эту проблему

a <- c(10,8,5,4,3)

Я ожидаю, что значение индекса h будет равно 4.

Если кто-то решил вашу проблему, примите решение или проголосуйте, как описано в разделе: stackoverflow.com/help/someone-answers.

Allan 22.05.2019 09:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
1 046
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Предполагая, что ввод уже отсортирован, я бы использовал это:

tail(which(a >= seq_along(a)), 1)
# [1] 4

Вы могли бы, конечно, поместить это в небольшую функцию:

h_index = function(cites) {
  if (max(cites) == 0) return(0) # assuming this is reasonable
  cites = cites[order(cites, decreasing = TRUE)]
  tail(which(cites >= seq_along(cites)), 1)
}

a1 = c(10,8, 5, 4, 3)
a2 = c(10, 9, 7, 1, 1)

h_index(a1)
# [1] 4

h_index(a2)
# [1] 3

h_index(1)
# [1] 1

## set this to be 0, not sure if that's what you want
h_index(0)
# [1] 0

но это не работает, если вектор > a<-c(10,9,7,1,1) > which(a <= seq_along(a))[1] [1] 4 В этом выводе должно быть 3 не 4..

djMohit 21.05.2019 21:43

я ожидаю 3, так как значение в позиции 4 равно 1, что меньше 4. это же упоминается в определении

djMohit 21.05.2019 21:48

Понял, неправильно понял < vs <=. Правки должны быть адресованы.

Gregor Thomas 21.05.2019 21:49

Дополнительные правки, теперь работает с вводом длины 1 и вводом, где наименее цитируемая работа по-прежнему превышает позицию. Единственный странный случай отсутствует, если вход равен 0 цитатам.

Gregor Thomas 21.05.2019 21:54

И еще одно редактирование для случая 0 цитирований. Если максимальное количество цитирований равно 0, верните 0 (при необходимости отрегулируйте).

Gregor Thomas 21.05.2019 22:10

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

hindex <- function(x) {
    tx <- sort(x, decreasing = T)
    print(sum(tx >= seq_along(tx)))
}

Версия dplyr, если данные цитирования находятся в фрейме данных (спасибо https://stackoverflow.com/users/5313511/oelshie):

a <- data.frame(cites = c(10,8,5,4,3))

b <- a %>% 
  arrange(desc(cites)) %>%
  summarise(h_index = sum(cites >= seq_along(cites)))
b

  h_index
1       4

Другие вопросы по теме