我想写一个函数来通过触及数据中最小数量的元素来改变中值。我的数据如下,
data = data.frame(name=letters, values = c(0.183487333,0.487690292, 0.510321455,0.616632727, 0.660789818, 0.845322255, 0.867910555, 0.911842909, 0.913312571, 1.017638286, 15.97454546, 16.20765382, 16.27542982, 16.307264, 17.38325527, 17.54139927, 70.08443928, 70.26106764, 75.79405382, 77.72412946, 79.58750724, 84.67373672, 87.04692364, 88.58626037, 94.79392582, 100.0000))
data = data %>% mutate(diff = abs(values - median(values)), rank_diff = dense_rank(diff)) %>% arrange(diff)
以下是我的功能,
changemedian <- function(data, increase, rows)
{
median2 = median(data$value)
new_median = median2 + increase
i = 0
print(data$name[1:rows])
data1 = data$values
while(median2<new_median){
x = median2
data1[1:rows] = data1[1:rows] + 0.2
median2 = median(data1)
i = i + 0.2
}
print(paste("values to be changed per name:",i))
cat("\n")
print(paste("New Median that could be achieved:" ,median2))
}
当我想将中位数增加1时,我可以调用此函数,我想只使用5个值来changemedian(data,1,5)
。代码工作正常。但是当我不能像changemedian(data,1,1)
那样实现中位数时,我给出了一个不可能的条件,循环继续运行。当中位数等于先前的中值时,我想循环退出。这里当median2在前一个循环中等于median2值时,我想通过说&#34;不可能&#34;来退出循环。
我遇到错误。有人可以帮我这么做吗?
由于
答案 0 :(得分:2)
我认为发生的事情是这样的 -
在changemedian(data,1,1)
的情况下,我们只增加第一个元素,它已经大于中位数。因此,中位数不会随着增加而改变,并且循环永远不会停止。
只有当你增加一些小于中位数的数字时,中位数才会增加。
编辑:要在重复中位数时退出循环,请添加以下行:
if ( median(data1) == median2 ) break;
在行
之前median2 = median(data1);