Как преобразовать фрейм данных, чтобы выполнить функцию, в которой изменяется эталонная группа? - PullRequest
1 голос
/ 07 марта 2020

Я все еще новичок в R, но я пытаюсь добавить столбец в мой фрейм данных, который выполняет функцию, которая дает изменение сгиба над контролем. Вот мой вопрос, примененный к этому набору данных:

chemistry    rate Digital biomass[mm^3] greenness average[] Height [mm]
1   Flavone   0.001             135090.45           0.2025817    81.21167
2   Flavone    0.01             144547.00           0.2078100    82.85367
3   Flavone     0.1             145807.70           0.2043300    84.96300
4   Flavone       1             110408.18           0.1949033    81.48700
5   Flavone      10              53585.55           0.1850100    69.78533
6   Flavone Control             138598.08           0.2172325    86.05992
7      SA3F2   0.001              158966.7           0.2051417    85.33000
8      SA3F2    0.01              167762.0           0.2113683    88.58500
9      SA3F2     0.1              159897.5           0.2021017    86.60617
10     SA3F2       1              181713.5           0.1995667    85.57567
11     SA3F2      10              136530.0           0.1964467    81.84200
12     SA3F2 Control              135043.2           0.2179492    86.33429

Я пытаюсь создать столбцы с кратными изменениями для каждого из текущих столбцов, которые принимают значение каждой нормы внесения (сгруппировано по химии) и делят его на контрольное значение, соответствующее химии.

Например:

Digital biomass fold change 
=134090.45/53585.55
=144547.00/53585.55

И так далее.

Я сгруппировал данные по химии и обработал все средние значения. Кажется, я не могу описать эту функцию так, чтобы это имело смысл.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

Предполагая, что интерпретация @ StupidWolf верна, вы хотите разделить значения из строки "Control" в каждой группе для нескольких столбцов, используя dplyr, мы можем сделать:

library(dplyr)
df %>%
  group_by(chemistry) %>%
  mutate_at(vars(`biomass[mm^3]`:`Height[mm]`), ~./.[rateDigital == 'Control'])


#   chemistry rateDigital `biomass[mm^3]` `greenness average[]` `Height[mm]`
#   <fct>     <fct>                 <dbl>                 <dbl>        <dbl>
# 1 Flavone   0.001                 0.975                 0.933        0.944
# 2 Flavone   0.01                  1.04                  0.957        0.963
# 3 Flavone   0.1                   1.05                  0.941        0.987
# 4 Flavone   1                     0.797                 0.897        0.947
# 5 Flavone   10                    0.387                 0.852        0.811
# 6 Flavone   Control               1                     1            1    
# 7 SA3F2     0.001                 1.18                  0.941        0.988
# 8 SA3F2     0.01                  1.24                  0.970        1.03 
# 9 SA3F2     0.1                   1.18                  0.927        1.00 
#10 SA3F2     1                     1.35                  0.916        0.991
#11 SA3F2     10                    1.01                  0.901        0.948
#12 SA3F2     Control               1                     1            1    
1 голос
/ 07 марта 2020

Допустим, это ваш фрейм данных:

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",]
...