首页 > 解决方案 > 用 R 中的 data.table 用前一列和特定条件填充 NA

问题描述

我有一些这样的表

        ID  V1  V2  V3  V4  V5  V6  V7  V8  V9 V10   limit
 1: 10167638  89  NA 116 102  96  NA 106 116  NA 144     3
 2: 10298462  74 114  NA  NA 114  NA 121 111  98 108     6
 3: 10316168  88  78  NA  77  72  96  NA  95  NA  NA     4
 4: 10423491 118  77  NA  86 139 127  NA 103  93  84     2
 5: 10497492  12 154  NA 121 121 114 111  NA  NA  NA     7
 6: 10619463  42  NA  NA  NA  NA  NA  NA  NA  NA 141     9
 7: 10631362 174  NA 125 118 117 116 139 116  NA 104    10
 8: 10725490  49  NA 175  NA 176  NA 139 123 140 141     5
 9: 10767348 140 106 174 162  NA 169 140 127 112  NA     6
10: 10832134  10 178  NA  NA 116  95  95 125 115 103     3

我尝试用前一列值填充这个 NA(如果 V2 是 NA 用 V1 值填充)

条件是限制(如果限制是 3,只需填写 NA 直到 V3 并留下 NA)

所以我尝试做的是这样

         ID  V1  V2  V3  V4  V5  V6  V7  V8  V9 V10  limit
 1: 10167638  89  89 116 102  96  NA 106 116  NA 144     3
 2: 10298462  74 114 114 114 114 114 121 111  98 108     6
 3: 10316168  88  78  78  77  72  96  NA  95  NA  NA     4
 4: 10423491 118  77  NA  86 139 127  NA 103  93  84     2
 5: 10497492  12 154 154 121 121 114 111  NA  NA  NA     7
 6: 10619463  42  42  42  42  42  42  42  42  42 141     9
 7: 10631362 174 174 125 118 117 116 139 116 116 104    10
 8: 10725490  49  49 175 175 176  NA 139 123 140 141     5
 9: 10767348 140 106 174 162 162 169 140 127 112  NA     6
10: 10832134  10 178 178  NA 116  95  95 125 115 103     3

实际数据非常大,所以用 data.table 解决这个问题会很好,但其他解决方案仍然可以,如 dplyr 或 tidyr 或其他解决方案。

标签: rdplyrdata.tablenatidyr

解决方案


使用data.tableset()功能:

代码

col <- paste0("V", 1:10)
for (i in 2:length(col)) {
  rows <- which(is.na(dt[[col[i]]]) & dt[["limit"]] >= i)
  set(
    x = dt,
    i = rows,
    j = col[i],
    value = dt[[col[i-1]]][rows]
  )
}

结果

dt
           ID  V1  V2  V3  V4  V5  V6  V7  V8  V9 V10 limit
 1:  10167638  89  89 116 102  96  NA 106 116  NA 144     3
 2:  10298462  74 114 114 114 114 114 121 111  98 108     6
 3:  10316168  88  78  78  77  72  96  NA  95  NA  NA     4
 4:  10423491 118  77  NA  86 139 127  NA 103  93  84     2
 5:  10497492  12 154 154 121 121 114 111  NA  NA  NA     7
 6:  10619463  42  42  42  42  42  42  42  42  42 141     9
 7:  10631362 174 174 125 118 117 116 139 139 139 104    10
 8:  10725490  49  49 175 175 176  NA 139 123 140 141     5
 9:  10767348 140 106 174 162 162 169 140 127 112  NA     6
10: 110832134  10 178 178  NA 116  95  95 125 115 103     3

数据

dt <- fread("     ID  V1  V2  V3  V4  V5  V6  V7  V8  V9 V10   limit
     10167638  89  NA 116 102  96  NA 106 116  NA 144     3
     10298462  74 114  NA  NA 114  NA 121 111  98 108     6
     10316168  88  78  NA  77  72  96  NA  95  NA  NA     4
     10423491 118  77  NA  86 139 127  NA 103  93  84     2
     10497492  12 154  NA 121 121 114 111  NA  NA  NA     7
     10619463  42  NA  NA  NA  NA  NA  NA  NA  NA 141     9
     10631362 174  NA 125 118 117 116 139 116  NA 104    10
     10725490  49  NA 175  NA 176  NA 139 123 140 141     5
     10767348 140 106 174 162  NA 169 140 127 112  NA     6
    110832134  10 178  NA  NA 116  95  95 125 115 103     3")

推荐阅读