R 如何计算h点
我试图写一个函数来计算h点。该函数在秩频率数据帧上定义。 考虑下面的数据帧:R 如何计算h点,r,function,if-statement,text-mining,quanteda,R,Function,If Statement,Text Mining,Quanteda,我试图写一个函数来计算h点。该函数在秩频率数据帧上定义。 考虑下面的数据帧: 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_point <- function(data){ x <- seq(nrow(data)) f_x <- data[["frequency"]][x
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_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
h_point您可以:
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
h_point我想我已经明白了你想要实现的目标。如果给定行的rank==frequency
,我的循环将遍历数据并在任意点中断。如果使用数据$rank[i]==fr(i)
显式测试,而不是依赖于i,以防绑定列组等,则可能更为谨慎
如果第i行的秩低于freq,而第j行的秩高于freq,则第二条if语句计算第i行和第j行的h点(s
)
这是你想要的吗
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))
}}
数据我想我已经明白了你想要实现的目标。如果给定行的rank==frequency
,我的循环将遍历数据并在任意点中断。如果使用数据$rank[i]==fr(i)
显式测试,而不是依赖于i,以防绑定列组等,则可能更为谨慎
如果第i行的秩低于freq,而第j行的秩高于freq,则第二条if语句计算第i行和第j行的h点(s
)
这是你想要的吗
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))
}}
DATA@akrun刚刚编辑了这个问题。添加了一个小的data.frame。希望它能有所不同。要修复for循环,您需要添加第二条if语句(else
没有条件选项)并结束循环。您提供的数据的预期输出是什么?@George感谢您的评论:)。因此,我添加了所需的内容。如果你的第一句话不可能的话,希望它现在有更好的意义。i被设置为运行1:15或数据长度$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,这些都不是真的。除了@Tanner33语句之外,在最后一个循环i==nrow(数据)上,j将是i+1。@akrun刚刚编辑了这个问题。添加了一个小的data.frame。希望它能有所不同。要修复for循环,您需要添加第二条if语句(else
没有条件选项)并结束循环。您提供的数据的预期输出是什么?@George感谢您的评论:)。因此,我添加了所需的内容。如果你的第一句话不可能的话,希望它现在有更好的意义。i被设置为运行1:15或数据长度$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,这些都不是真的。除了@Tanner33语句之外,您将在最后一个循环i==nrow(数据)和j将是i+1。非常感谢!只需要小的修改。长度(h)>1永远不会为真,因为它是排名频率数据,所以长度(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)>=1
。这是一个广义代码,反映了您所拥有的。即使将f
用作函数而不是频率。请注意,所有内容都已矢量化。非常感谢!只需要小的修改。长度(h)>1永远不会为真,因为它是排名频率数据,所以长度(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)>=1
。这是一个广义代码,反映了您所拥有的。即使将f
用作函数而不是频率。请注意,所有内容都是矢量化的。