为了解释我的问题,让我介绍一下我的数据集。
这是我的数据库示例。
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
/ clockst
与start
发生冲突。由于某些原因,在实验开始之前已观察到个体,因此基本上所有的情节都在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)
答案 0 :(得分:2)
OP要求在每个start == 0
的{{1}}的首次出现之前删除所有行。这相当于为每个idno
保留start == 0
的第一次出现(包括)后的所有行。
这可以使用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
除了过滤数据外,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 == 0
和day_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()