根据以前的记录在列中填充(NA值),并在R中填充另一列(带间隔)
我想根据它的记录和时间来填写根据以前的记录在列中填充(NA值),并在R中填充另一列(带间隔),r,R,我想根据它的记录和时间来填写action列。行动栏中的NA应根据以前的行动记录和时间间隔填写。假设我们将时间间隔设置为10,这意味着如果动作是A,时间是1,那么action中的所有NA都应该是A,直到time==11(1+10) 请注意,如果action或ID发生更改,则应重置此过程。例如(在第3行)我们有B和time==11,我想用B填充下一个NAs直到time==21,但是我们在time==16中有C,所以我们继续用C填充NA直到time==26 df<-read.table(text
action
列。行动
栏中的NA应根据以前的行动记录和时间间隔填写。假设我们将时间间隔设置为10
,这意味着如果动作是A
,时间是1
,那么action
中的所有NA
都应该是A
,直到time==11(1+10)
请注意,如果action
或ID
发生更改,则应重置此过程。例如(在第3行)我们有B
和time==11
,我想用B
填充下一个NAs直到time==21
,但是我们在time==16
中有C
,所以我们继续用C填充NA直到time==26
df<-read.table(text="
id action time
1 A 1
1 NA 4
1 NA 9
1 B 11
1 NA 12
1 C 16
1 NA 19
1 NA 30
1 A 31
1 NA 32
2 NA 1
2 A 2
2 NA 6",header=T,stringsAsFactors = F)
Desired Result:
id action time
1 A 1
1 A 4
1 A 9
1 B 11
1 B 12
1 C 16
1 C 19
1 NA 30
1 A 31
1 A 32
2 NA 1
2 A 2
2 A 6
df我们可以提取非NA行作为填充值的参考,然后遍历数据集,并根据值是否满足id
的要求和时间间隔有条件地替换值
# Use row numbers as an index (unique Id)
df$idx <- 1:nrow(df)
# Find the non-NA rows to use a reference for imputation
idx <- df %>%
group_by(id) %>%
na.omit(action)
如果您正在运行此示例代码,请确保在继续之前重新创建df
和idx
,因为它将被最后一个示例代码块修改
时间间隔要求我们对time
的值进行逻辑测试,并进行另一项测试,以避免尝试对NA值进行time
比较:
# Accounting for the max interval:
interval <- 10
for(r in 1:nrow(df)){
if(is.na(df$action[r])){
if(!is.na(dplyr::last(idx$time[idx$idx < df$idx[r] & idx$id == df$id[r]]))){
if(dplyr::last(idx$time[idx$idx < df$idx[r] & idx$id == df$id[r]]) + interval >= df$time[r])
df$action[r] <- dplyr::last(idx$action[idx$idx < df$idx[r] & idx$id == df$id[r]])
}
}
}
df
#考虑最大间隔:
间隔=df$时间[r])
df$action[r]似乎是数据的一个例子<代码>df[is.na(action),action:=df[!is.na(action)][.SD,on=(id,time),x.action,roll=10]
# Accounting for the max interval:
interval <- 10
for(r in 1:nrow(df)){
if(is.na(df$action[r])){
if(!is.na(dplyr::last(idx$time[idx$idx < df$idx[r] & idx$id == df$id[r]]))){
if(dplyr::last(idx$time[idx$idx < df$idx[r] & idx$id == df$id[r]]) + interval >= df$time[r])
df$action[r] <- dplyr::last(idx$action[idx$idx < df$idx[r] & idx$id == df$id[r]])
}
}
}
df
id action time idx
1 1 A 1 1
2 1 A 4 2
3 1 A 9 3
4 1 B 11 4
5 1 B 12 5
6 1 C 16 6
7 1 C 19 7
8 1 <NA> 30 8
9 1 A 31 9
10 1 A 32 10
11 2 <NA> 1 11
12 2 A 2 12
13 2 A 6 13