Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据以前的记录在列中填充(NA值),并在R中填充另一列(带间隔)_R - Fatal编程技术网

根据以前的记录在列中填充(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