Question

I have a dataframe that contains 7 p-value variables. I can't post it because it is private data but it looks like this:

>df
    o           m           l           c           a           aa          ep
    1.11E-09    4.43E-05    0.000001602 4.02E-88    1.10E-43    7.31E-05    0.00022168
    8.57E-07    0.0005479   0.0001402   2.84E-44    4.97E-17    0.0008272   0.000443361
    0.00001112  0.0005479   0.0007368   1.40E-39    3.17E-16    0.0008272   0.000665041
    7.31E-05    0.0006228   0.0007368   4.59E-33    2.57E-13    0.0008272   0.000886721
    8.17E-05    0.002307    0.0008453   4.58E-18    5.14E-12    0.0008336   0.001108402

Each column has values from 0-1. I would like to subset the entire data frame by extracting all the values in each column less than 0.009 and making a new data frame. If I were to extract on this condition, the columns would have very different lengths. E.g. c has 290 values less than 0.009, and o has 300, aa has 500 etc.

I've tried:

subset(df,c<0.009 & a<0.009 & l<0.009 & m<0.009& aa<0.009 & o<0.009)

When I do this I just end up with a very small number of even columns which isn't what I want, I want all values in each column fitting the subset criteria in the data.

I then want to take this data frame and bin it into p-value range groups by using something like the summary(cut()) function, but I am not sure how to do it.

So essentially I would like to have a final data frame that includes the number of values in each p-value bin for each variable:

                o#   m# l#  c#  a#  aa# ep#
0.00-0.000001   545 58  85  78  85  45  785
0.00001-000.1   54  77  57  57  74  56  58
0.001-0.002 54  7   5   5   98  7   5   865
Was it helpful?

Solution

An attempt:

sapply(df,function(x) table(cut(x[x<0.009],c(0,0.000001,0.001,0.002,Inf))) )

#              o m l c a aa ep
#(0,1e-06]     2 0 0 5 5  0  0
#(1e-06,0.001] 3 4 5 0 0  5  4
#(0.001,0.002] 0 0 0 0 0  0  1
#(0.002,Inf]   0 1 0 0 0  0  0
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top