r - 重新编码多个缺失值
问题描述
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”?
解决方案
(没有任何包)中的一个选项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]
推荐阅读
- android - 从 Android 中的 AWSAppSyncClient 删除/清除缓存策略
- keras - 从高层架构实现cnn时,如何确定每一层的步幅和填充类型?
- html - Angular Material:当触发器位于不同组件中时如何切换sidenav
- c++ - GCC:在调试版本中优化的静态数据成员
- xamarin - Xamarin HybridWebView 未在 iOS 设备中加载 url
- python - 如何发布 Python 3 无源 RPM?
- facebook-graph-api - 是否有任何功能类似于“标记”但包括非公开帖子的边缘?
- couchbase - N1QL 多重连接和求和查询产生错误的输出
- google-apps-script - 应用程序脚本强制谷歌表格中的特定行高
- winforms - 在许多 .net core 3 windows 窗体应用程序(如 GAC)之间使用相同的 dll