[R] dividing values of each column in a dataframe

Rolf Turner rolf.turner at xtra.co.nz
Tue Feb 7 00:09:56 CET 2012


I believe your post is  misleading.  Your example "works"
purely by chance.

R uses "column ordering",  so entries 1 to 3 of column 1 in your
example get divided by 2, 3, and 4 respectively.  Then "scal" is
*recycled* and entries 4, 5, and 6, get divided by 2, 3, and 4
respectively, and so on.

It just *happens* that entry 4 of column 1 gets divided by 2,
entry 4 of column 2 gets divided by 3, and entry 4 of column 3
gets divided by 4, giving the impression that you are getting
what you want.  But if you look at row 5 of your "df" you'll see
something different.

# The same (due to serendipity --- or it's converse!):
 > (df/scal)[4,]
                   a                  b                  c
4 0.0156342 0.03288247 0.02057588
 > df[4,]/scal
                   a                  b                  c
4 0.0156342 0.03288247 0.02057588

# Not the same!
 > (df/scal)[5,]
                   a                  b                  c
5 0.07904605 0.01585556 0.4562085
 > df[5,]/scal
                   a                  b                  c
5 0.1185691 0.02114075 0.2281042

As has already been pointed out in this thread, to get what you think
you're getting, you need to use transpose t(t(df)/scal).

     cheers,

         Rolf Turner

On 07/02/12 08:54, Berend Hasselman wrote:
> On 06-02-2012, at 20:22, Abhishek Pratap wrote:
>
>> Hey Guys
>>
>> I want to divide(numerically) all the columns of a data frame by
>> different numbers. Here is what I am  doing but getting a weird error.
> I don't think you are getting an error.
> You are getting an unexpected result (you think).
>
>> The values in each column are not getting divided by the corresponding
>> value in the denominator vector instead by the alternative values. I
>> am sure I am messing up something.
>>
>> Appreciate your help
>> -Abhi
>>
>> head(counts)
>>                WT_CON WT_RB MU_CON MU_RB
>> row1       839   180    477   187
>>
>>
>> head(counts/c(2,3,4,5))
>>                WT_CON    WT_RB    MU_CON    MU_RB
>> row1      419.50000  45.0000  238.5000  46.7500
> I tried this
>
> df<- data.frame(a=runif(10),b=runif(10),c=runif(10))
> scal<- c(2,3,4)
>
>> df
>              a          b          c
> 1  0.47661685 0.73457617 0.90045279
> 2  0.06916502 0.76374600 0.07630196
> 3  0.17029174 0.29450289 0.07416969
> 4  0.03126839 0.09864740 0.08230353
> 5  0.23713816 0.06342224 0.91241698
> 6  0.21970595 0.86890690 0.47316101
> 7  0.46380324 0.26142304 0.87823277
> 8  0.81256517 0.76097474 0.98956553
> 9  0.74425369 0.29228545 0.27496707
> 10 0.65425285 0.40166967 0.12231213
>
>> df/scal
>              a          b          c
> 1  0.23830843 0.24485872 0.22511320
> 2  0.02305501 0.19093650 0.03815098
> 3  0.04257293 0.14725144 0.02472323
> 4  0.01563419 0.03288247 0.02057588
> 5  0.07904605 0.01585556 0.45620849
> 6  0.05492649 0.43445345 0.15772034
> 7  0.23190162 0.08714101 0.21955819
> 8  0.27085506 0.19024369 0.49478276
> 9  0.18606342 0.14614273 0.09165569
> 10 0.32712642 0.13388989 0.03057803
>
> Checking:
>> df[4,]/scal
>             a          b          c
> 4 0.01563419 0.03288247 0.02057588
>
>
> This is what you want guessing from your description.
> You haven't given us an example with desired output.
>
> Berend
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list