计算浓度在数据框中保持在特定值以上的时间

时间:2016-02-28 23:39:30

标签: r dataframe dplyr

我想计算浓度保持在200以上的时间。我的模拟数据框有以下列:

exports.handler = function(event, context) {
  console.log('Received event:', JSON.stringify(event, null, 2));

  if (event.Records[0].s3.object.size > MAX_FILE_SIZE) {
    var error = new Error("Validation error: the file is too big.")
    context.fail(error);
  }
  console.log('Event validation complete.')

  var bucket = event.Records[0].s3.bucket.name;
  var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
  var fileName = key.split("/")[1];
  var params = {
    Bucket: bucket,
    Key: key
  };
  console.log('Starting processing of the following file: ' + JSON.stringify(params, null, 2));

  async.waterfall([
    function download(callback) {
        // Download the image from S3 into a buffer.
        console.log("Downloading the image from S3...");
        s3.getObject(params, function(err, data) {
            if (err) {
                callback(err);
            } else {
                callback(null, data);
            }
        });
    },
  ...
  ], ...)
}

我的想法是为df <- ID TIME CONC 1 0 20 1 2 50 1 4 150 1 6 210 1 9 260 2 0 20 2 2 50 2 4 70 2 6 100 2 9 150 3 0 20 3 2 50 3 4 250 3 6 310 3 9 150 添加0,1标志,然后,对于每个人,请记下标志为1时的时差。

CONC >= 200

给出:

#add flag
df$flag200 <- ifelse(df$CONC >= 200,1,0)

如果总结CONC标志为1时的TIME差异,我需要帮助。例如,df <- ID TIME CONC FLAG 1 0 20 0 1 2 50 0 1 4 150 0 1 6 210 1 1 9 260 1 2 0 20 0 2 2 50 0 2 4 70 0 2 6 100 0 2 9 150 0 3 0 20 0 3 2 50 0 3 4 250 1 3 6 310 1 3 9 150 0 的{​​{1}}为tdif,等于ID==1 。输出应该是这样的:

TIME==9 minus TIME==6

1 个答案:

答案 0 :(得分:2)

在指标上使用diff表示浓度至少为200,您可以识别感兴趣的时间范围的所有开始和结束,总结这些时间戳的差异以获得总的经过时间:

library(dplyr)
df %>%
  group_by(ID) %>%
  summarize(tdiff = sum(TIME[diff(c(CONC >= 200, 0)) == -1] -
                        TIME[diff(c(0, CONC >= 200)) == 1]))
#      ID tdiff
#   (int) (int)
# 1     1     3
# 2     2     0
# 3     3     2

请注意,即使在给定ID的多次运行至少值为200的情况下,此代码也会起作用,并且不会计算值低于200的运行之间的时间。