0

df

sampleName     realConc      exptname concentrate timepoints replicate    day  var
name1_0     3.877049e-05           0hr        55mM          0        b1 011311   1
name1_20    3.293085e-04           kcl        55mM         20        b1 011311   2
name1_40    3.999433e-05           kcl        55mM         40        b1 011311   3
name2_0     2.939995e-03           0hr        55mM          0        b1 011411   1
name2_20    1.212584e-02           kcl        55mM         20        b1 011411   2
name2_40    1.894434e-02           kcl        55mM         40        b1 011411   3

I want to divide every realConc value by the realConc value with a timepoint of 0 that has the has an equal day,replicate, and concentrate value

I was trying a for loop, and not too much luck, can you help me out?

for (i in 1:dim(df)[1]){

df$realConc <- df$realConc[i] / df[which(duplicated(paste(replicate,day))) & df$timepoint == 0,]$realConc[i]
}

I was thinking something like this, but it obviously doesn't work

4

3 に答える 3

3

plyr is your friend!

library(plyr)
ddply(df, .(day, replicate, concentrate),
      transform, scaled=realConc/realConc[timepoints==0])

#   sampleName     realConc exptname concentrate timepoints replicate   day var   scaled
# 1    name1_0 3.877049e-05      0hr        55mM          0        b1 11311   1 1.000000
# 2   name1_20 3.293085e-04      kcl        55mM         20        b1 11311   2 8.493793
# 3   name1_40 3.999433e-05      kcl        55mM         40        b1 11311   3 1.031566
# 4    name2_0 2.939995e-03      0hr        55mM          0        b1 11411   1 1.000000
# 5   name2_20 1.212584e-02      kcl        55mM         20        b1 11411   2 4.124442
# 6   name2_40 1.894434e-02      kcl        55mM         40        b1 11411   3 6.443664
于 2012-08-18T07:19:19.577 に答える
1

You haven't specified what you want your output to look like, but here's one way to perform that calculation:

First, read in your data (It's better to use dput() or provide some code to recreate your data).

test = read.table(header=TRUE, text = "sampleName     realConc      exptname concentrate timepoints replicate    day  var
name1_0     3.877049e-05           0hr        55mM          0        b1 011311   1
name1_20    3.293085e-04           kcl        55mM         20        b1 011311   2
name1_40    3.999433e-05           kcl        55mM         40        b1 011311   3
name2_0     2.939995e-03           0hr        55mM          0        b1 011411   1
name2_20    1.212584e-02           kcl        55mM         20        b1 011411   2
name2_40    1.894434e-02           kcl        55mM         40        b1 011411   3")

Then, split your data according to the groupings you require.

temp = split(test, list(test$day, test$concentrate, test$replicate))

Third, figure out the realConc value for timepoints == 0 by group, and use that to do your division.

lapply(temp, function(x) x[, 2]/x[which(x$timepoints == 0), 2])
# $`11311.55mM.b1`
# [1] 1.000000 8.493793 1.031566
# 
# $`11411.55mM.b1`
# [1] 1.000000 4.124442 6.443664

Update: data.frame output

temp = split(test, list(test$day, test$concentrate, test$replicate))
temp = lapply(temp, function(x) { x$divided = x[, 2]/
  x[which(x$timepoints == 0), 2]; x })
temp = do.call(rbind, temp)
rownames(temp) = NULL
temp
#   sampleName     realConc exptname concentrate timepoints replicate   day var  divided
# 1    name1_0 3.877049e-05      0hr        55mM          0        b1 11311   1 1.000000
# 2   name1_20 3.293085e-04      kcl        55mM         20        b1 11311   2 8.493793
# 3   name1_40 3.999433e-05      kcl        55mM         40        b1 11311   3 1.031566
# 4    name2_0 2.939995e-03      0hr        55mM          0        b1 11411   1 1.000000
# 5   name2_20 1.212584e-02      kcl        55mM         20        b1 11411   2 4.124442
# 6   name2_40 1.894434e-02      kcl        55mM         40        b1 11411   3 6.443664
于 2012-08-18T07:09:15.860 に答える
0

This is a simple base R version. It might be easier to debug since each step is visible.

# find all possible denominators and rename realConc to avoid duplicate name in merge
denom <- x[x$timepoints == 0,c('realConc','concentrate','replicate','day')]
names(denom)[1] <- 'realConcDenominator'

# merge in new column with appropriate denominator
x$realConcDenominator <- merge(x,denom,by = c('concentrate','replicate','day'),all.x = T)[,'realConcDenominator']

# and divide
x$result <- x$realConc / x$realConcDenominator

And another using apply.

# or use apply in one shot
x$applyresult <- apply(x,1,function(x,denom){
  as.numeric(x['realConc'])/denom[denom$concentrate == x['concentrate'] & denom$replicate == x['replicate'] & denom$day == x['day'],'realConc']
},denom = x[x$timepoints == 0,c('realConc','concentrate','replicate','day')])
于 2014-11-03T06:57:39.447 に答える