我已经在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的解决方案不是必不可少的
答案 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.*