Допустим, это ваш фрейм данных:
df = structure(list(chemistry = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Flavone", "SA3F2"), class = "factor"),
rateDigital = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L,
3L, 4L, 5L, 6L), .Label = c("0.001", "0.01", "0.1", "1",
"10", "Control"), class = "factor"), `biomass[mm^3]` = c(135090.45,
144547, 145807.7, 110408.18, 53585.55, 138598.08, 158966.7,
167762, 159897.5, 181713.5, 136530, 135043.2), `greenness average[]` = c(0.2025817,
0.20781, 0.20433, 0.1949033, 0.18501, 0.2172325, 0.2051417,
0.2113683, 0.2021017, 0.1995667, 0.1964467, 0.2179492), `Height[mm]` = c(81.21167,
82.85367, 84.963, 81.487, 69.78533, 86.05992, 85.33, 88.585,
86.60617, 85.57567, 81.842, 86.33429)), class = "data.frame", row.names = c(NA,
-12L))
Из-за имен столбцов (пробелы, специальные символы и т. Д. c - кошмар), я предлагаю вам определить столбцы, которые нужно разделить сначала:
CHEMISTRY=1
TYPE = 2
VALUES = 3:5
newvalues = by(df,df[,CHEMISTRY],function(x){
sweep(x[,VALUES],2,as.numeric(x[x[,TYPE]=="Control",3:5]),"/")
})
newvalues = do.call(rbind,newvalues)
newvalues = cbind(df[,1:2],newvalues)
newvalues
chemistry rateDigital biomass[mm^3] greenness average[] Height[mm]
Flavone.1 Flavone 0.001 0.9746921 0.9325571 0.9436643
Flavone.2 Flavone 0.01 1.0429221 0.9566248 0.9627440
Flavone.3 Flavone 0.1 1.0520182 0.9406051 0.9872540
Flavone.4 Flavone 1 0.7966069 0.8972106 0.9468635
Flavone.5 Flavone 10 0.3866255 0.8516681 0.8108923
Flavone.6 Flavone Control 1.0000000 1.0000000 1.0000000
SA3F2.7 SA3F2 0.001 1.1771544 0.9412363 0.9883674
SA3F2.8 SA3F2 0.01 1.2422840 0.9698053 1.0260697
SA3F2.9 SA3F2 0.1 1.1840470 0.9272881 1.0031492
SA3F2.10 SA3F2 1 1.3455953 0.9156570 0.9912130
SA3F2.11 SA3F2 10 1.0110098 0.9013417 0.9479663
SA3F2.12 SA3F2 Control 1.0000000 1.0000000 1.0000000
Вы можете удалить элемент управления, используя:
newvalues[newvalues[,2]!="Control",]