在ID中用R子集替换NA中的999

Rag*_*mvs 3 r subset dplyr

我在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))
Run Code Online (Sandbox Code Playgroud)

生成的数据帧如下

  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
Run Code Online (Sandbox Code Playgroud)

我希望通过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
Run Code Online (Sandbox Code Playgroud)

我试过这段代码

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

我收到以下错误

 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
Run Code Online (Sandbox Code Playgroud)

我请求有人看看.我无法弄清楚.对于基于dplyr的解决方案不是必需的

Sot*_*tos 8

我们可以all用来捕获所有NA的组.因为我们想要替换NA所有列中的s,所以我们可以使用mutate_all,其中funs(即应用于所有列的函数)是值为NA replace()的组的简单all().替换是999.

library(tidyverse)

df %>% 
 group_by(ID) %>% 
 mutate_all(funs(replace(., all(is.na(.)), 999)))
Run Code Online (Sandbox Code Playgroud)

这使,

# A tibble: 6 x 4
# Groups:   ID [2]
  ID       II    JJ    KK
  <fct> <dbl> <dbl> <dbl>
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
Run Code Online (Sandbox Code Playgroud)