Как рассчитать значение на основе нескольких переменных?

У меня есть такой набор данных (df):

Iso conc.   rep time    OD
1   1      1    0     0.2
1   1.5    2    0     0.2
1   2      3    0     0.2
2   1      1    0     0.3
2   1.5    2    0     0.25
2   2      3    0     0.3
1   1      1    1     0.4
1   1.5    2    1     0.35
1   2      3    1     0.38
2   1      1    1     0.4
2   1.5    2    1     0.45
2   2      3    1     0.43

И я хочу получить результат growth=OD(time=1)-OD(time=0) на основе Iso, conc и rep.

Результат будет таким:

Iso conc.   rep time    growth
1   1      1    1      0.2
1   1.5    2    1      0.15
1   2      3    1      0.18
2   1      1    1      0.1
2   1.5    2    1      0.2
2   2      3    1      0.13

Я думал использовать data.table для расчета роста.

DT <- as.data.table(df)
DT[, , by = .(Iso,conc.,rep,set)]

Но я не знаю, как написать часть до двух запятых. Может кто-нибудь мне помочь?


person Ziming    schedule 01.05.2017    source источник
comment
я не вижу time=2   -  person mtoto    schedule 01.05.2017
comment
ой, извините. неправильный набор текста. исправьте это сейчас. 'рост = OD (время = 1) -OD (время = 0)'   -  person Ziming    schedule 01.05.2017


Ответы (2)


Используя data.table, вы можете просто:

dt[,.(growth = OD[time==1]-OD[time==0]),.(Iso,conc.,rep)]
#   Iso conc. rep growth
#1:   1   1.0   1   0.20
#2:   1   1.5   2   0.15
#3:   1   2.0   3   0.18
#4:   2   1.0   1   0.10
#5:   2   1.5   2   0.20
#6:   2   2.0   3   0.13
person mtoto    schedule 01.05.2017
comment
Я был так близко! Большое спасибо! Ха-ха;) - person Ziming; 01.05.2017

Вы можете сделать это с помощью:

DT [, list(growth = OD[time == 1] - OD[time == 0]), by=.(Iso,conc.,rep)]

Или, наоборот, если вы уверены, что в каждой группе только два значения:

DT [order(time), list(growth = diff(OD), by=.(Iso,conc.,rep)]
person David Robinson    schedule 01.05.2017
comment
Вы имеете в виду, что если у меня больше точек времени (например, 0, 1, 2,3 ...), то я больше не могу использовать diff, верно? - person Ziming; 01.05.2017
comment
Чтобы гарантировать порядок, можно использовать DT[order(time), ...] для второго. - person Frank; 01.05.2017
comment
@Frank, что я должен заказать (OD) или заказать (время)? - person Ziming; 01.05.2017
comment
Извините, сначала у меня была опечатка, я имел ввиду order(time). Если у вас больше раз, diff просто возьмет разницу между соседними значениями (для 1 минус 0, для 2 - 1 и т. Д.) @Ziming - person Frank; 01.05.2017
comment
@Ziming order(time) прав, см. Редактировать. И да, это верно в отношении наличия большего количества точек времени, а не в том случае, если вам нужна разница только в 0 и 1. (Вы всегда можете предварительно отфильтровать [time <= 1] шаг. - person David Robinson; 01.05.2017
comment
Ok! Я получаю это сейчас! Спасибо! @ Фрэнк @ Патронус - person Ziming; 01.05.2017