【问题标题】:How to calculate a value basing on several variables?如何根据多个变量计算一个值?
【发布时间】:2017-05-01 16:41:04
【问题描述】:

我有一个这样的数据集(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

我想得到基于 Iso、conc 和 rep 的结果 growth=OD(time=1)-OD(time=0)

输出会是这样的:

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)]

但我不知道如何写两个逗号之前的部分。有人可以帮我吗?

【问题讨论】:

  • 我看不到time=2
  • 哎呀,对不起。输入错误。现在纠正它。 '增长=OD(时间=1)-OD(时间=0)'

标签: r data.table dplyr calculation


【解决方案1】:

使用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

【讨论】:

  • 我是如此接近!非常感谢!哈哈;)
【解决方案2】:

你可以这样做:

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

或者,如果您确定每组中只有两个值:

DT [order(time), list(growth = diff(OD), by=.(Iso,conc.,rep)]

【讨论】:

  • 所以你的意思是如果我有更多的时间点(例如 0、1、2,3...),那么我就不能再使用 diff 了,对吧?
  • 为了保证订单,第二个可以使用DT[order(time), ...]
  • @Frank 我应该订购(OD)还是订购(时间)?
  • 对不起,我一开始有错字,我的意思是order(time)。如果你有更多的时间,diff 将只取相邻值之间的差异(对于 1 - 0,对于 2 - 1,等等)@Ziming
  • 好的!我现在明白了!谢谢! @Frank@Patronus