基于模糊识别识别和增加序列

时间:2018-01-14 18:07:47

标签: r dplyr data.table sequence increment

为了解释我的问题,让我介绍一下我的数据集。

这是我的数据库示例。

idno是唯一标识符,day是观察日,clockst是当天的开始,start是观察开始,end观察结束和time每集的持续时间。

在这个数据库中,每个idno被观察两天,所以总共 2880分钟

    idno    day clockst start  end time
1     1 Monday    1.30  1290 1310   20
2     1 Monday    1.50  1310 1320   10
3     1 Monday    2.00  1320 1440  120
4     1 Monday    4.00     0  385  385
5     1 Monday   10.25   385  405   20
6     1 Monday   10.45   405  450   45
7     1 Monday   11.30   450  485   35
8     1 Monday   12.05   485  495   10
9     1 Monday   12.15   495  515   20
10    1 Monday   12.35   515  600   85
11    1 Monday   14.00   600  615   15
12    1 Monday   14.15   615  640   25
13    1 Monday   14.40   640  705   65
14    1 Monday   15.45   705  710    5
15    1 Monday   15.50   710  725   15

我的主要问题是day / clockststart发生冲突。由于某些原因,在实验开始之前已观察到个体,因此基本上所有的情节都在start == 0之前。 (start == 0表示实验的开始)。

例如,在start == 0之前观察到行1-3。

我想要删除这些行。 但是,由于以下问题,我不知道如何唯一地标识每个 idno / day

看一下样本的另一部分

   idno     day clockst start  end time
30    1  Monday   21.10  1030 1055   25
31    1  Monday   21.35  1055 1110   55
32    1  Monday   22.30  1110 1155   45
33    1  Monday   23.15  1155 1170   15
34    1  Monday   23.30  1170 1290  120
35    1 Tuesday    0.15  1215 1310   95
36    1 Tuesday    1.50  1310 1320   10
37    1 Tuesday    2.00  1320 1440  120
38    1 Tuesday    4.00     0  385  385
39    1 Tuesday   10.25   385  405   20
40    1 Tuesday   10.45   405  450   45

您可以在此处看到和实验结束时不一样。如果你看第33-34行,你可以看到实验从星期一到星期二继续。

这就是为什么我无法通过idno和day识别唯一的观察时间。

最终,我想要的是这个

    idno     day clockst start  end time ep day_obs select
1      1  Monday    1.30  1290 1310   20 NA       1 remove
2      1  Monday    1.50  1310 1320   10 NA       1 remove
3      1  Monday    2.00  1320 1440  120 NA       1 remove
4      1  Monday    4.00     0  385  385  1       1   keep
5      1  Monday   10.25   385  405   20  2       1   keep
6      1  Monday   10.45   405  450   45  3       1   keep
7      1  Monday   11.30   450  485   35  4       1   keep
8      1  Monday   12.05   485  495   10  5       1   keep
9      1  Monday   12.15   495  515   20  6       1   keep
10     1  Monday   12.35   515  600   85  7       1   keep
11     1  Monday   14.00   600  615   15  8       1   keep

我想创建一个名为ep的变量,增加观察时间,并在“预观察”期间丢失,以便我删除NA行。

我还想创建观察日的变量(day_obs),该变量不是基于day,而是基于实验的开始

知道我怎么能这样做吗?

我在 csv文件上放置数据和输出的子样本

library(RCurl)
df <- getURL("https://raw.githubusercontent.com/giacomovagni/df_germany_sample/master/df_germany_subsample.csv")
df <- read.csv(text = df)

output <- getURL("https://raw.githubusercontent.com/giacomovagni/df_germany_sample/master/df_germany_sample_output.csv")
output <- read.csv(text = output)

1 个答案:

答案 0 :(得分:2)

OP要求在每个start == 0的{​​{1}}的首次出现之前删除所有行。这相当于为每个idno保留start == 0的第一次出现(包括)后的所有行。

变式1:仅子集化

这可以使用idno

来实现
data.table
library(data.table)
df <- fread("https://raw.githubusercontent.com/giacomovagni/df_germany_sample/master/df_germany_subsample.csv")

df2 <- df[df[, .I[seq(first(which(start == 0)), .N)], by = idno]$V1]
df2

解释

     idno     day clockst start  end time
  1:    1  Monday    4.00     0  385  385
  2:    1  Monday   10.25   385  405   20
  3:    1  Monday   10.45   405  450   45
  4:    1  Monday   11.30   450  485   35
  5:    1  Monday   12.05   485  495   10
 ---                                     
 98:    2 Tuesday   22.00  1080 1090   10
 99:    2 Tuesday   22.10  1090 1135   45
100:    2 Tuesday   22.55  1135 1145   10
101:    2 Tuesday   23.05  1145 1170   25
102:    2 Tuesday   23.30  1170 1260   90

返回每个df[, .I[seq(first(which(start == 0)), .N)], by = idno] 要保留的行的行索引。这些用于idno

的后续子集
df

变式2:替代方法和其他问题的答案

除了过滤数据外,OP还要求

  • 为每个 idno V1 1: 1 4 2: 1 5 3: 1 6 4: 1 7 5: 1 8 --- 98: 2 104 99: 2 105 100: 2 106 101: 2 107 102: 2 108 创建一个观察天数day_obs,每次遇到idno时都会提前
  • 每个start == 0day_obs的行数(OP称之为误导增加观察时间)。

idno可以通过

在未经过滤的原始day_obs中创建
df
df[, day_obs := cumsum(start == 0 ), by = idno]
df

请注意,第一次出现 idno day clockst start end time day_obs 1: 1 Monday 1.30 1290 1310 20 0 2: 1 Monday 1.50 1310 1320 10 0 3: 1 Monday 2.00 1320 1440 120 0 4: 1 Monday 4.00 0 385 385 1 5: 1 Monday 10.25 385 405 20 1 --- 104: 2 Tuesday 22.00 1080 1090 10 2 105: 2 Tuesday 22.10 1090 1135 45 2 106: 2 Tuesday 22.55 1135 1145 10 2 107: 2 Tuesday 23.05 1145 1170 25 2 108: 2 Tuesday 23.30 1170 1260 90 2 之前的行可以start == 0进行过滤。

现在,我们可以根据

的要求轻松创建day_obs == 0
ep
df[day_obs > 0, ep := rowid(idno, day_obs)]
df

数据

由于以后下载链接可能会中断,以下是下载数据的 idno day clockst start end time day_obs ep 1: 1 Monday 1.30 1290 1310 20 0 NA 2: 1 Monday 1.50 1310 1320 10 0 NA 3: 1 Monday 2.00 1320 1440 120 0 NA 4: 1 Monday 4.00 0 385 385 1 1 5: 1 Monday 10.25 385 405 20 1 2 --- 104: 2 Tuesday 22.00 1080 1090 10 2 18 105: 2 Tuesday 22.10 1090 1135 45 2 19 106: 2 Tuesday 22.55 1135 1145 10 2 20 107: 2 Tuesday 23.05 1145 1170 25 2 21 108: 2 Tuesday 23.30 1170 1260 90 2 22

dput()