【问题标题】:how to calculate h-point如何计算h点
【发布时间】:2020-12-07 04:30:26
【问题描述】:

我正在尝试编写一个函数来计算 h 点。该函数是在秩频率数据帧上定义的。 考虑以下 data.frame :

DATA <-data.frame(frequency=c(49,48,46,38,29,24,23,22,15,12,12,10,10,9,9), rank=c(seq(1, 15)))

h点的公式是:

如果{有一个 r = f(r), h-point = r } else { h 点 = f(i)j-f(j)i / j-i+f(i)-f(j) } 其中 f(i)f(j) 是第 i 个和第 j 个等级的对应频率,ijij>f(j) 的相邻等级。

现在,我尝试了以下代码:

fr <-function(x){d <-DATA$frequency[x]
return(d)}

for (i in 1:length(DATA$rank)) {
j <- i+1
if (i==fr(i))
return(i)
else(i<fr(i) && j>fr(j)) {
s <-fr(i)*j-fr(j)*i/j-i+fr(i)-fr(j)
return(s)
}}

我也试过了:

for (i in 1:length(DATA$rank)) {
    j <- i+1
    if (i==fr(i))
        return(i)
    if (i<fr(i) while(j>fr(j))) {
        s <-fr(i)*j-fr(j)*i/j-i+fr(i)-fr(j)
        return(s)
    }}

它们都不起作用。对于 DATA ,所需的结果将是 i=11j=12,因此: h点=12×12 - 10×11 / 12 - 11 + 12 - 10

你能告诉我我做错了什么吗?

【问题讨论】:

  • @akrun 刚刚编辑了问题。添加了一个小的data.frame。希望它有所作为。
  • 要修复您的 for 循环,您需要添加第二个 if 语句(else 没有条件选项)并关闭循环。您提供的 DATA 的预期输出是什么?
  • @George 感谢您的评论:)。结果,我添加了所需的内容。希望现在更有意义
  • 您的第一个 if 语句是不可能的。 i 设置为运行 1:15 或 Data$rank 的长度,并且您的函数正在读取数据框第 x 行中的频率,介于 9 到 49 之间。您的 if 语句正在检查 1==49, 2==48, 3==46, 4==38, 5==29, 6==24, 7==23, 8==22, 9==15, 10==12, 11==12, 12==10, 13==10, 14==9, 或 15==9 没有一个是 TRUE
  • 除了@Tanner33 语句之外,您将在最后一个循环中使用 j 索引超出范围 i == nrow(DATA) 并且 j 将是 i+1。

标签: r function if-statement text-mining quanteda


【解决方案1】:

我想我已经弄清楚了您想要实现的目标。如果rank == frequency 对于给定的行,我的循环将通过 DATA 并随时中断。如果可能更谨慎地使用DATA$rank[i] == fr(i) 明确测试这一点,而不是依赖 i,以防绑定等级等。

第二个 if 语句计算第 i 行和第 j 行的 h 点 (s),如果第 i 行的排名低于 freq,而第 j 行的排名更高。

这是你想要的吗?

DATA <-data.frame(frequency=c(49,48,46,38,29,24,23,22,15,12,12,10,10,9,9), rank=c(seq(1, 15)))
fr <-function(x){d <-DATA$frequency[x]
return(d)}

for(i in 1:nrow(DATA)){
  j <- i+1
  if (i==fr(i)){
    s <- list(ij=c(i=i,j=j), h=i)
    break
  }else if(i <fr(i) && j>fr(j)){
    s <-list(ij=c(i=i,j=j),h=fr(i)*j-fr(j)*i/j-i+fr(i)-fr(j))
}}

我不确定公式是否正确,在你的循环中你有 j-i,但在解释中它是 i-j。不确定整个 i-j+fr(i)-fr(j) 是否是分母,分子也是如此。简单的修复。

【讨论】:

    【解决方案2】:

    你可以这样做:

    h_point <- function(data){
      x <- seq(nrow(data))
      f_x <- data[["frequency"]][x]
      h <- which(x == f_x)
      if(length(h)>1) h
      else{
        i <- which(x<f_x)
        j <- which(x>f_x)
        s <- which(outer(i,j,"-") == -1, TRUE)
        i <- i[s[,1]]
        j <- j[s[,2]]
        cat("i: ",i, "j: ", j,"\n")
        f_x[i]*j - f_x[j]*i / (i-j + f_x[i]-f_x[j])
      }
    }
    
    h_point(DATA) 
    i:  11 j:  12 
    [1] 34
    

    【讨论】:

    • 感谢一百万!只需要进行小的修改。 length(h)>1 永远不会成立,因为它是排名频率数据,所以 length(h)==1 是合乎逻辑的。最后一行需要一对括号才能工作:(f_x[i]*j - f_x[j]*i) / (j-i + f_x[i]-f_x[j])。分母也是(j-i+f_x(i)-f_x(j)),而不是(i-j + f_x[i]-f_x[j])
    • @抱歉,应该声明length(h)&gt;=1。这是一个通用代码,不管你有什么。即使您使用f 作为函数而不是频率。请注意,所有内容都是矢量化的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2020-02-20
    • 2016-04-08
    相关资源
    最近更新 更多