Reputation: 549
I am trying to normalize all rows of my matrix data at once within range 0 and 1. But I don't know how to do it.. For example, I want to normalize each "obs1", "obs2", "obs3". Thus, minimum, maximum, and sum of each "obs1", "obs2", "obs3" will be used. My data format is,
`mydata
a b c d e
obs1 8.15609 11.5379 11.1401 8.95186 7.95722
obs2 339.89800 856.3470 691.3490 590.28600 543.67200
obs3 2.12776 46.4561 136.8860 118.09100 119.86400
`
Also, When I searched to perform this, people used "function()". When/for what does this used?
Thank you very much for your help in advance! :)
Upvotes: 22
Views: 39997
Reputation: 161
You could use the apply
with rescale
as the following:
apply(mydata, 1, rescale)
where the second argument 1
tells apply to work with rows.
The default range is [0, 1] but a custom range can be specified with the to
argument that will be forwarded to the rescale
function:
apply(mydata, 1, rescale, to=c(1,2))
Dependecy:
if(!require(scales)){
install.packages("scales", dependencies=TRUE)
library(scales)
}
Upvotes: 5
Reputation: 467
for(i in 2:length(mydata[1,])){
mydata[,i] <- prop.table(mydata[,i])
}
Normalized matrix will be updated in mydata
Upvotes: 0
Reputation: 13372
To normalize for each row, you can use apply
and then subtract the minimum from each column and divide by the difference between maximum and minimum:
t(apply(mydata, 1, function(x)(x-min(x))/(max(x)-min(x))))
gives you
a b c d e
obs1 0.05553973 1.0000000 0.8889038 0.2777796 0.0000000
obs2 0.00000000 1.0000000 0.6805144 0.4848262 0.3945675
obs3 0.00000000 0.3289472 1.0000000 0.8605280 0.8736849
What happens is that you apply the function
function(x){
(x-min(x))/(max(x)-min(x))
}
to each row of your data frame.
Upvotes: 30