Я новичок в 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.
Предполагая, что ввод уже отсортирован, я бы использовал это:
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..
я ожидаю 3, так как значение в позиции 4 равно 1, что меньше 4. это же упоминается в определении
Понял, неправильно понял <
vs <=
. Правки должны быть адресованы.
Дополнительные правки, теперь работает с вводом длины 1 и вводом, где наименее цитируемая работа по-прежнему превышает позицию. Единственный странный случай отсутствует, если вход равен 0 цитатам.
И еще одно редактирование для случая 0 цитирований. Если максимальное количество цитирований равно 0, верните 0 (при необходимости отрегулируйте).
Я предлагаю более короткую + более гибкую функцию, которая принимает любой числовой вектор цитат, которые вы включаете (отсортированные или несортированные, с нулями или без них, только нули и т. д.).
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
Если кто-то решил вашу проблему, примите решение или проголосуйте, как описано в разделе: stackoverflow.com/help/someone-answers.