Округлить в R с одним ограничением - PullRequest
1 голос
/ 10 апреля 2019

У меня есть этот набор данных:

B <- c(60.65, 25.25)
D <- c(10, 10)
E <- c(30.35, 65.75)
Total <- c(100,100) 

Я хочу округлить столбцы с учетом B+D+E = 100

Большое спасибо за вашу помощь.

Приветствую!

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Я предполагаю, что вы спрашиваете, как масштабировать записи из B, D, E так, чтобы они составляли Total. На мой взгляд, слово «круглый» не имеет особого смысла.

Если это так, вы можете сделать следующее

df <- data.frame(B, D, E) * Total / rowSums(data.frame(B, D, E))
df
#        B       D        E 
#1 60.0495 9.90099 30.04950 
#2 25.0000 9.90099 65.09901

Затем data.frame df содержит масштабированные векторы столбцов B, D, E. Мы можем подтвердить, что на самом деле компоненты составляют Total

rowSums(df)
#[1] 100 100
0 голосов
/ 10 апреля 2019

Суммы значений строк близки к 100, но простое округление не всегда дает 100, например, первый ряд.Итак, перед округлением давайте выполним масштабирование, которое изменяет сумму значений строки с 'close' до точно равного 100. Однако может возникнуть такая ситуация, что даже округление после масштабирования не даст сумму, равную 100, поэтому давайтеисправьте это, изменив значения одного из столбцов:

# additional value 100/3
B <- c(60.65, 25.25, 100/3)
D <- c(10, 10, 100/3)
E <- c(30.35, 65.75, 100/3)
Total <- c(100, 100, 100) 

df <- round(data.frame(B, D, E)*100/rowSums(data.frame(B, D, E)))

df
#   B  D  E
#1 60 10 30
#2 25 10 65
#3 33 33 33

rowSums(df)
#[1] 100 100  99

df[,3] <- 100 - rowSums(df[,1:2])

df
#   B  D  E
#1 60 10 30
#2 25 10 65
#3 33 33 34

rowSums(df)
#[1] 100 100 100
...