首页 > 解决方案 > 重新编码多个缺失值

问题描述

set.seed(1)
data=data.frame("a"=sample(-5:5, 20, r=T),
"b"=sample(-5:5, 20, r=T),
"c"=sample(-5:5, 20, r=T))

使用实际列名在“a”和“b”和“c”之间设置值的最有效方法是什么:-5、-3、4 到“NA”?

标签: rdata.table

解决方案


(没有任何包)中的一个选项base R是复制值,进行比较并分配给NA

data[data == c(-5, -3, 4)[col(data)]] <- NA

如果我们只需要选定的列

nm1 <- c('a', 'c')
data[nm1][data[nm1]== c(-5, 4)[col(data[nm1])]] <- NA

如果我们要为每列替换多个值,则使用lapply

data[nm1] <- lapply(data[nm1], function(x) replace(x, x %in% c(-5, -3, 4), NA))

tidyverse,我们可以使用case_when

library(dplyr)
data %>% 
    mutate_at(vars(nm1),  ~ case_when(!. %in% c(-5, -3, 4) ~ .))

对于多个值

data %>% 
   mutate_at(vars(nm1),  ~ case_when(. %in% 4 ~ 99L, !. %in% c(-5, -3) ~ .))
#    a  b  c
#1   3  3  3
#2  -2  3  2
#3   1 -1  3
#4  NA -1  1
#5  -4 -4  2
#6   1  4  0
#7   5  3 99
#8  -4 -5  1
#9   5 -2 NA
#10 NA -3 99
#11 NA  0  0
#12 -1  4  2
#13 -1  4 -4
#14 99  0 -4
#15  0 -2  0
#16 99 -2  0
#17  1  4 NA
#18  3  3 NA
#19 -1  1 NA
#20 -1  0  2

data.table,我们可以使用fcase

library(data.table)
setDT(data)[, (nm1) := lapply(.SD, function(x) fcase(x %in% 4 ~ 99L, !x %in% c(-5, -3) ~ x)), .SDcols = nm1]

推荐阅读