Циклы для нормализации данных - PullRequest
2 голосов
/ 19 марта 2020

Вот небольшой набор данных

RWC<-as.data.frame(matrix(1:9,ncol=3))
RWC
V1 V2 V3
 1  4  7  
 2  5  8  
 3  6  9  

Я пытаюсь нормализовать, суммируя строки по отдельности и получая первоначальное число, деленное на сумму. Это должно привести к этому (мне не нужно округление, это просто для удобства).

V1    V2    V3
0.08  0.33  0.58  
0.13  0.33  0.53  
0.16  0.33  0.50 

Я уже написал

for(i in 3:nrow(RWC)){
  normalise <- sum(row[3:ncol])
  RWC <- ()
}

Я застрял при попытке разделить и дать значение для указанных c строки и столбца, как бы я это сделал?

Ответы [ 3 ]

4 голосов
/ 19 марта 2020

Мы можем использовать prop.table с margin как 1.

prop.table(as.matrix(RWC), 1)

#          V1     V2     V3
#[1,] 0.08333 0.3333 0.5833
#[2,] 0.13333 0.3333 0.5333
#[3,] 0.16667 0.3333 0.5000

prop.table это обертка вокруг sweep

sweep(RWC, 1, rowSums(RWC), `/`)
4 голосов
/ 19 марта 2020

Быстрый способ получить сумму в каждом ряду - rowSums(RWC). Затем просто разделите RW C на результат.

RWC <- RWC / rowSums(RWC)
2 голосов
/ 19 марта 2020

Без использования for l oop, вы можете использовать функцию apply:

apply(RWC,1, function(x) round(x/sum(x),2))

   [,1] [,2] [,3]
X1 0.08 0.13 0.17
X2 0.33 0.33 0.33
X3 0.58 0.53 0.50
...