填写缺失值

时间:2020-02-24 15:30:10

标签: r dplyr data.table

data=data.frame("student"=c(1,1,1,1,2,2,2,2,3,3,3,3,4),
                "timeHAVE"=c(1,4,7,10,2,5,NA,11,6,NA,NA,NA,3),
                "timeWANT"=c(1,4,7,10,2,5,8,11,6,9,12,15,3))

library(dplyr);library(tidyverse)
data$timeWANTattempt=data$timeHAVE
data <- data %>% 
  group_by(student) %>% 
  fill(timeWANTattempt)+3

我有“ timeHAVE”,我想用之前的+3代替缺少的时间。我展示了我的dplyr尝试,但是没有用。我寻求一个data.table解决方案。谢谢。

3 个答案:

答案 0 :(得分:3)

您可以尝试。

data %>% 
  group_by(student) %>%
  mutate(n_na = cumsum(is.na(timeHAVE))) %>% 
  mutate(timeHAVE = ifelse(is.na(timeHAVE), timeHAVE[n_na == 0 & lead(n_na) == 1] + 3*n_na, timeHAVE))
   student timeHAVE timeWANT  n_na
     <dbl>    <dbl>    <dbl> <int>
 1       1        1        1     0
 2       1        4        4     0
 3       1        7        7     0
 4       1       10       10     0
 5       2        2        2     0
 6       2        5        5     0
 7       2        8        8     1
 8       2       11       11     1
 9       3        6        6     0
10       3        9        9     1
11       3       12       12     2
12       3       15       15     3
13       4        3        3     0

我包括了小帮手n_na,它连续计数NA。然后,第二个变异将NA的数量乘以3,并将其添加到NA之前的第一个非NA元素中

答案 1 :(得分:1)

这是一种使用'locf'填充的方法

setDT(data)
data[ , by = student, timeWANT := {
  # carry previous observations forward whenever missing
  locf_fill = nafill(timeHAVE, 'locf')
  # every next NA, the amount shifted goes up by another 3
  na_shift = cumsum(idx <- is.na(timeHAVE))
  # add the shift, but only where the original data was missing
  locf_fill[idx] = locf_fill[idx] + 3*na_shift[idx]
  # return the full vector
  locf_fill
}]

警告如果给定的student可以在NA中具有多个不连续的timeHAVE值,这将不起作用

答案 2 :(得分:0)

另一个没有分组的data.table选项:

setDT(data)[, w := fifelse(is.na(timeHAVE) & student==shift(student), 
    nafill(timeHAVE, "locf") + 3L * rowid(rleid(timeHAVE)), 
    timeHAVE)]

输出:

    student timeHAVE timeWANT  w
 1:       1        1        1  1
 2:       1        4        4  4
 3:       1        7        7  7
 4:       1       10       10 10
 5:       2        2        2  2
 6:       2        5        5  5
 7:       2       NA        8  8
 8:       2       11       11 11
 9:       3        6        6  6
10:       3       NA        9  9
11:       3       NA       12 12
12:       3       NA       15 15
13:       4       NA       NA NA
14:       4        3        3  3

student = 4的数据首次具有NA:

data = data.frame("student"=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4),
        "timeHAVE"=c(1,4,7,10,2,5,NA,11,6,NA,NA,NA,NA,3),
        "timeWANT"=c(1,4,7,10,2,5,8,11,6,9,12,15,NA,3))