On Mar 12, 2010, at 5:27 PM, Sam Albers wrote:

Hello all,

I have not been able to find an answer to this problem. I feel like it might
be so simple though that it might not get a response.

Suppose I have a dataframe like the one I have copied below (minus the
'calib' column). I wish to create a column like calib where I am subtracting the 'Count' when 'stain' is 'none' from all other 'Count' data for every value of 'rep'. This is sort of analogous to putting a $ in front of the number that identifies a cell in a spreadsheet environment. Specifically I
need some like this:

mydataframe$calib <- Count - (Count when stain = none for each value rep)

Any thoughts on how I might accomplish this?

Thanks in advance.

Sam

Note: I've already calculated the calib column in gnumeric for clarity.

rep Count stain calib
1 1522         none 0
1 147         syto -1375
1 544.8 sytolec -977.2
1 2432.6 sytolec 910.6
1 234.6 sytolec -1287.4
2 5699.8 none 0
2 265.6 syto -5434.2
2 329.6 sytolec -5370.2
2 383         sytolec -5316.8
2 968.8 sytolec -4731
3 2466.8 none 0
3 1303         syto -1163.8
3 1290.6 sytolec -1176.2
3 110.2 sytolec -2356.6
3 15086.8 sytolec 12620

This method does not depend on the ordering which I believe both solutions so far do require (but it may fail if there is more than one value satisfying the stain=="none" test). It is an example of what Spector calls split-apply-bind logic. See below:

> dfrm$calib2 <- unlist( lapply(split(dfrm, dfrm$rep),
function(x) x$calib <- x$Count- x[x$stain == "none", "Count"]) )
> dfrm
   repp   Count   stain   calib  calib2
1     1  1522.0    none     0.0     0.0
2     1   147.0    syto -1375.0 -1375.0
3     1   544.8 sytolec  -977.2  -977.2
4     1  2432.6 sytolec   910.6   910.6
5     1   234.6 sytolec -1287.4 -1287.4
6     2  5699.8    none     0.0     0.0
7     2   265.6    syto -5434.2 -5434.2
8     2   329.6 sytolec -5370.2 -5370.2
9     2   383.0 sytolec -5316.8 -5316.8
10    2   968.8 sytolec -4731.0 -4731.0
11    3  2466.8    none     0.0     0.0
12    3  1303.0    syto -1163.8 -1163.8
13    3  1290.6 sytolec -1176.2 -1176.2
14    3   110.2 sytolec -2356.6 -2356.6
15    3 15086.8 sytolec 12620.0 12620.0

> dfrm[3,3] <-"none"
> dfrm$calib2 <- unlist( lapply(split(dfrm, dfrm$rep), function(x) x $calib <- x$Count- x[x$stain=="none", "Count"]) )
Warning message:
In x$Count - x[x$stain == "none", "Count"] :
  longer object length is not a multiple of shorter object length

--

David Winsemius, MD
West Hartford, CT

______________________________________________
R-help@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.

Reply via email to