Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.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_Dplyr_Data.table_Na_Tidyr - Fatal编程技术网

用上一列填写NA,用R中的数据表填写具体条件

用上一列填写NA,用R中的数据表填写具体条件,r,dplyr,data.table,na,tidyr,R,Dplyr,Data.table,Na,Tidyr,我有一些这样的桌子 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:

我有一些这样的桌子

        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
我尝试用上一列值填充此NAs (如果V2为NA,则用V1值填充)

条件为限制(如果限制为3,则只需填写NA直到V3,并使用NAs离开)

所以我试着这样做

         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或其他解决方案。

您可以尝试
tidyverse

library(tidyverse)
dt %>% 
  gather(k, v, -ID, -limit) %>% # make df from wide to long
  mutate(k = factor(k, levels = unique(k))) %>% # for correct spreading in the last step
  group_by(ID) %>% 
  mutate(gr=ifelse(is.na(v), 1:n(), 0)) %>%  # check where the NA's are
  fill(v) %>% # update the values
  mutate(v = ifelse(limit >= gr, v, NA)) %>% # change to NA back again accrding limit
  select(-gr) %>% 
  spread(k, v) # backtransform to long
# A tibble: 10 x 12
# Groups:   ID [10]
          ID limit    V1    V2    V3    V4    V5    V6    V7    V8    V9   V10
       <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
 1  10167638     3    89    89   116   102    96    NA   106   116    NA   144
 2  10298462     6    74   114   114   114   114   114   121   111    98   108
 3  10316168     4    88    78    78    77    72    96    NA    95    NA    NA
 4  10423491     2   118    77    NA    86   139   127    NA   103    93    84
 5  10497492     7    12   154   154   121   121   114   111    NA    NA    NA
 6  10619463     9    42    42    42    42    42    42    42    42    42   141
 7  10631362    10   174   174   125   118   117   116   139   116   116   104
 8  10725490     5    49    49   175   175   176    NA   139   123   140   141
 9  10767348     6   140   106   174   162   162   169   140   127   112    NA
10 110832134     3    10   178   178    NA   116    95    95   125   115   103
库(tidyverse)
dt%>%
聚集(k,v,-ID,-limit)%>%#从宽到长进行df
变异(k=因子(k,级别=唯一(k)))%>%#以便在最后一步中正确传播
分组依据(ID)%>%
突变(gr=ifelse(is.na(v),1:n(),0))%>%#检查na的位置
填充(v)%>%#更新值
变异(v=ifelse(limit>=gr,v,NA))%>%#根据limit再次更改为NA
选择(-gr)%>%
扩展(k,v)#反向转换为长
#一个tibble:10x12
#组别:ID[10]
ID限制V1 V2 V3 V4 V6 V7 V8 V9 V10
10167638 3 89 116 102 96 NA 106 116 NA 144
2  10298462     6    74   114   114   114   114   114   121   111    98   108
3 10316168 4 88 78 77 72 96 NA 95 NA
4 10423491 2 118 77 NA 86 139 127 NA 103 93 84
5 10497492 7 12 154 154 121 121 114 111 NA NA NA NA NA
6  10619463     9    42    42    42    42    42    42    42    42    42   141
7  10631362    10   174   174   125   118   117   116   139   116   116   104
8 10725490 5 49 175 176 NA 139 123 140 141
9 10767348 6140 106 174 162 162 169 140 127 112 NA
110832134 3 10178 178 NA 116 95 125 115 103

使用
数据。表
set()
函数:

代码

资料


dt您可以使用
dput()
发布您的数据样本吗?而且,您尝试过…?@hrbrmstr我认为链接的问题无法解决问题,因为op正在使用
data.table
寻找解决方案。我会发布我的答案,但它被关闭了……抱歉,@MRau。再-opened@snoram我在NAs中填充了此代码
data.frame(t(dt))%%>%fill(,,name(.))%%>%t())
,但问题是它填充了所有需要某种功能的NAslimit@zellkim,我刚刚测试了它,它的工作原理如上图所示。您是否加载了
数据表
库?
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")