按组使用现有值替换NAs

时间:2018-05-07 22:38:38

标签: r dplyr

我需要使用 vals vals2 中的值替换 s1 s2 中的缺失值相同的相对位置。我无法按组索引dplyr中的位置。如果有其他方法,我很乐意尝试。

数据

id = c(1,1,1,1,1,1,2,2,2,2)
date=101:110
vals = c(101:110)
vals2 = c(1:10)


test = data.frame(id,date,vals,vals2)
test<-test%>% group_by(id)%>%
  mutate(s1=rollsumr(vals,k=3,fill=NA),
        s2=rollsumr(vals,k=2,fill=NA))

test

      id  date  vals vals2    s1    s2
   <dbl> <int> <int> <int> <int> <int>
 1    1.   101   101     1    NA    NA
 2    1.   102   102     2    NA   203
 3    1.   103   103     3   306   205
 4    1.   104   104     4   309   207
 5    1.   105   105     5   312   209
 6    1.   106   106     6   315   211
 7    2.   107   107     7    NA    NA
 8    2.   108   108     8    NA   215
 9    2.   109   109     9   324   217
10    2.   110   110    10   327   219

我的代码(不工作)

test<-test %>%
   mutate(s1=replace(s1, ???, NA),
          s2=replace(s2,???,NA))

欲望输出

      id  date  vals vals2    s1    s2
   <dbl> <int> <int> <int> <int> <int>
 1    1.   101   101     1    101   1
 2    1.   102   102     2    102   203
 3    1.   103   103     3   306   205
 4    1.   104   104     4   309   207
 5    1.   105   105     5   312   209
 6    1.   106   106     6   315   211
 7    2.   107   107     7    107    7
 8    2.   108   108     8    108   215
 9    2.   109   109     9   324   217
10    2.   110   110    10   327   219

1 个答案:

答案 0 :(得分:2)

您可以使用ifelse

test %>% 
 mutate(s1 = ifelse(is.na(s1), vals, s1),
        s2 = ifelse(is.na(s2), vals2, s2))
# A tibble: 10 x 6
# Groups:   id [2]
#     id  date  vals vals2    s1    s2
#  <dbl> <int> <int> <int> <int> <int>
#1    1.   101   101     1   101     1
#2    1.   102   102     2   102   203
#3    1.   103   103     3   306   205
#4    1.   104   104     4   309   207
#5    1.   105   105     5   312   209
#6    1.   106   106     6   315   211
#7    2.   107   107     7   107     7
#8    2.   108   108     8   108   215
#9    2.   109   109     9   324   217
#10   2.   110   110    10   327   219