将ID分配的R中的NA值替换为999

时间:2019-02-28 07:16:53

标签: r dplyr subset

我已经在R中创建了以下数据框

    df<-data.frame("ID"=c("A", "A", "A", "B", "B", "B"),"II"=c(NA, NA, 
    NA,1,2,3),"JJ"=c(1,2,3, NA, NA, NA), 'KK'=c(1,2,NA, NA, 5,6))

生成的数据帧如下

  ID II JJ KK
   A NA  1  1
   A NA  2  2
   A NA  3 NA
   B  1 NA NA
   B  2 NA  5
   B  3 NA  6

我想通过ID值对数据帧进行子集化,并将所有仅包含NA值的列替换为999。结果应如下所示

 ID  II  JJ KK
  A 999   1  1
  A 999   2  2
  A 999   3 NA
  B   1 999 NA
  B   2 999  5
  B   3 999  6

我已经尝试过此代码

   library(dplyr)
   df%>%
   group_by(ID)%>%
   select(II, JJ,KK)%>%
   mutate_if(df[, colSums(is.na(df)) == nrow(df)]<999)

我遇到以下错误

 Adding missing grouping variables: `ID`
 Error in tbl_if_vars(.tbl, .p, .env, ..., .include_group_vars = 
 .include_group_vars) : 
 length(.p) == length(tibble_vars) is not TRUE

我要求某人看看。我无法弄清楚。对于基于dplyr的解决方案不是必不可少的

3 个答案:

答案 0 :(得分:8)

我们可以使用all来捕获具有所有NA的组。由于我们要替换所有列中的NA,因此我们可以使用mutate_all,其中funs(即要应用于所有列的函数)是简单的{{1 replace()值为NA的组中的}}。替换为all()

999

给出,

library(tidyverse)

df %>% 
 group_by(ID) %>% 
 mutate_all(funs(replace(., all(is.na(.)), 999)))

答案 1 :(得分:2)

也要加入data.table解决方案:

library(data.table)
setDT(df)
df[, lapply(.SD, 
            function(col) if (all(is.na(col))) 999 else col), 
     by = ID]
#    ID  II  JJ KK
# 1:  A 999   1  1
# 2:  A 999   2  2
# 3:  A 999   3 NA
# 4:  B   1 999 NA
# 5:  B   2 999  5
# 6:  B   3 999  6

我们用ID遍历所有非lapply列,如果全部都是999,则将它们替换为NA

答案 2 :(得分:0)

以及基本的r方法:

cudnn 7.0.*