如何在R中编写计算H指数的函数?

问题描述 投票:0回答:4

我是 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。

r function
4个回答
7
投票

假设输入已经排序,我会使用这个:

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

3
投票

我提出了一个更短+更灵活的函数,它可以接受您所包含的任何引用数字向量(排序或未排序,有或没有零,只有零等)

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

0
投票

如果引文数据位于数据框中,则为 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

0
投票

执行此计算的最有效方法是使用

eddington
包的
E_num
函数。作者的赫希指数本质上与自行车运动中使用的称为爱丁顿数的指标相同。
eddington
包使用Rcpp中实现的高效算法,不需要对数据进行预排序。

install.packages("eddington")

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

eddington::E_num(citation_counts)
## [1] 4

顺便说一句,如果你更喜欢使用基本 R,@oelshie 提供的答案可以进一步简化为一行。

get_h_index <- function(citations) {
  sum(sort(citations, decreasing = TRUE) >= seq_along(citations))
}

get_h_index(citation_counts)
## [1] 4

将计算抽象为函数也简化了 @aterhorst 提供的

dplyr
代码。请注意,该函数还消除了对
arrange
步骤的需要,因为排序是在函数调用内执行的。

tibble::tibble(citation_counts) |> 
  dplyr::summarize(h_index = get_h_index(citation_counts))
## # A tibble: 1 × 1
##   h_index
##     <int>
## 1       4

请注意,基本 R 解决方案比

eddington
软件包慢约 14 倍。如果工作流程需要计算大量 Hirsch 指数,我强烈建议安装和使用
eddington
软件包。

© www.soinside.com 2019 - 2024. All rights reserved.