在R中,根据重复ID从其他行中其他多个单元格的值中填充多个单元格的值?

时间:2015-11-06 12:35:17

标签: r filter filtering na

这可能有点令人困惑,但请看下表:

ID  |  PatientID  |  VisitCode  |  EXAMDATE  |  AGE
--------------------------------------------------------
1   |  7362       |  BL      | 21/08/2015 |     19
2   |  7362       |  M06     | 21/08/2015 |     NA
3   |  7362       |  M36     | 21/08/2015 |     NA

4   |  7363       |  BL      | 21/08/2015 |     NA
5   |  7363       |  M36     | 21/08/2015 |     70

6   |  7366       |  BL      | 21/08/2015 |     NA
7   |  7366       |  M03     | 21/08/2015 |     65
8   |  7366       |  M06     | 21/08/2015 |     NA
9   |  7366       |  M012    | 21/08/2015 |     NA

上面的例子显示了在不同就诊时记录的3名患者的数据。问题是,在某些访问中,某些数据被填写为 NA ,因为它已无法使用,因为它已在之前的访问中记录过。

预期产出:

ID  |  PatientID  |  VisitCode  |  EXAMDATE  |  AGE
--------------------------------------------------------
1   |  7362       |  BL      | 21/08/2015 |     19
2   |  7362       |  M06     | 21/08/2015 |     19
3   |  7362       |  M36     | 21/08/2015 |     19

4   |  7363       |  BL      | 21/08/2015 |     70
5   |  7363       |  M36     | 21/08/2015 |     70

6   |  7366       |  BL      | 21/08/2015 |     65
7   |  7366       |  M03     | 21/08/2015 |     65
8   |  7366       |  M06     | 21/08/2015 |     65
9   |  7366       |  M012    | 21/08/2015 |     65

我希望有一个代码可以根据最近的非NA访问次数替换每位患者的NA。 访问代码列表:

  • BL
  • M03
  • M06
  • M012
  • M036

1 个答案:

答案 0 :(得分:2)

使用dplyr:

library(dplyr)
dat %>% group_by(PatientID) %>%
        mutate(AGE = AGE[!is.na(AGE)][1])

Source: local data frame [9 x 5]
Groups: PatientID [3]

     ID PatientID VisitCode   EXAMDATE   AGE
  (int)     (int)    (fctr)     (fctr) (int)
1     1      7362        BL 21/08/2015    19
2     2      7362       M06 21/08/2015    19
3     3      7362       M36 21/08/2015    19
4     4      7363        BL 21/08/2015    70
5     5      7363       M36 21/08/2015    70
6     6      7366        BL 21/08/2015    65
7     7      7366       M03 21/08/2015    65
8     8      7366       M06 21/08/2015    65
9     9      7366      M012 21/08/2015    65