我在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的解决方案不是必需的
我们可以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)
这使,
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