Процент округления до 100% в R

У меня есть набор процентов в R, который я хочу сделать равным 100%. Мне нужно, чтобы индивидуальные проценты составляли до ближайшего целого числа.

У меня есть округленные проценты [20,5, 50,6, 25,8, 3,1]. Затем я округляю до ближайшего целого числа [20,50,25,3]. Затем выработка отдельных знаков после запятой [0,5,0,6,0,8,0,1 ]. Затем сортировка десятичных знаков в порядке убывания, но вывод [3,2,1,4]. И мне нужно добавить 1 к целому числу с самым высоким десятичным разрядом, пока не достигнет 100.

Ответ 1

На самом деле это не так тривиально, как может показаться. Некоторые хорошие обсуждения проблемы можно увидеть в этом потоке, и именно там я получил решение (которое идентично идее в OP).

Здесь функция, которая может сделать это для вас

round_percent <- function(x) { 
    x <- x/sum(x)*100  # Standardize result
    res <- floor(x)    # Find integer bits
    rsum <- sum(res)   # Find out how much we are missing
    if(rsum<100) { 
        # Distribute points based on remainders and a random tie breaker
        o <- order(x%%1, sample(length(x)), decreasing=TRUE) 
        res[o[1:(100-rsum)]] <- res[o[1:(100-rsum)]]+1
    } 
    res 
}

Надеюсь, это поможет. Обратите внимание на то, что в вышеприведенной функции вообще отсутствует проверка ошибок.