我想计算浓度保持在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
答案 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的运行之间的时间。