在multiate_at()中使用case_When()重新编码具有不同类型NA的几列 [英] Using case_when() within mutate_at() to recode several columns with different types of NA
本文介绍了在multiate_at()中使用case_When()重新编码具有不同类型NA的几列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
给定数据:
df <- structure(list(cola = structure(c(5L, 9L, 6L, 2L, 7L, 10L, 3L,
8L, 1L, 4L), .Label = c("a", "b", "d", "g", "q", "r", "t", "w",
"x", "z"), class = "factor"), colb = c(156L, 8L, 6L, 100L, 49L,
31L, 189L, 77L, 154L, 171L), colc = c(0.207140279468149, 0.51990159181878,
0.402017514919862, 0.382948065642267, 0.488511856179684, 0.263168515404686,
0.38591041485779, 0.774066215148196, 0.763264901703224, 0.474355421960354
), cold = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("a",
"b"), class = "factor")), class = "data.frame", row.names = c(NA,
-10L))
df
# cola colb colc cold
# 1 q 156 0.2071403 a
# 2 x 8 0.5199016 b
# 3 r 6 0.4020175 a
# 4 b 100 0.3829481 b
# 5 t 49 0.4885119 a
# 6 z 31 0.2631685 b
# 7 d 189 0.3859104 a
# 8 w 77 0.7740662 b
# 9 a 154 0.7632649 a
# 10 g 171 0.4743554 b
如果特定行的colc
中的值是>= 0.5
,我想用NA替换该行中所有其他单元格的内容,但该行的cold
内容除外(我希望保留原样)。
我尝试使用dplyr::mutate_at()
和base::ifelse()
执行此操作,运行正常:
df %>% mutate_at(vars(-c(cold)), funs(ifelse(colc >= 0.5, NA, .)))
# cola colb colc cold
# 1 5 156 0.2071403 a
# 2 NA NA NA b
# 3 6 6 0.4020175 a
# 4 2 100 0.3829481 b
# 5 7 49 0.4885119 a
# 6 10 31 0.2631685 b
# 7 3 189 0.3859104 a
# 8 NA NA NA b
# 9 NA NA NA a
# 10 4 171 0.4743554 b
但我希望使用dplyr::case_when()
来完成此操作,因为我可能有多个替换条件要满足(例如,替换为"foo"
IFcolc < 0.5 & colc >= 0.3
)。但是case_when()
似乎玩得不好:
df %>% mutate_at(vars(-c(cold)), funs(case_when(colc >= 0.5 ~ NA, TRUE ~ .)))
错误:必须是逻辑向量,而不是因子对象
为什么会发生这种情况,我可以做些什么来修复它?我假设这是因为我正在尝试将具有不同数据类型的多个列转换为NA。我尝试在网上寻找解决方案,但找不到。
编辑:具体地说,我希望保留各列的数据类型。
推荐答案
library(dplyr)
df %>%
mutate_at(vars(-c(cold)), ~ case_when(colc >= 0.5 ~ `is.na<-`(., TRUE), TRUE ~ .))
# cola colb colc cold
# 1 q 156 0.2071403 a
# 2 <NA> NA NA b
# 3 r 6 0.4020175 a
# 4 b 100 0.3829481 b
# 5 t 49 0.4885119 a
# 6 z 31 0.2631685 b
# 7 d 189 0.3859104 a
# 8 <NA> NA NA b
# 9 <NA> NA NA a
# 10 g 171 0.4743554 b
说明
使用case_when
分配NA
时,需要指定NA
的类型,即NA_integer_
、NA_real_
、NA_complex_
和NA_character_
。但是,mutate_at
同时转换多个列,并且这些列具有不同的类型,因此您不能将一条语句应用于所有列。理想情况下,可能存在类似NA_guess
的内容来标识类型,但到目前为止我还没有找到。这个方法有点棘手。我使用is.na()
将输入向量转换为nas,这些nas将与输入向量的类型相同。例如:
x <- 1:5
is.na(x) <- TRUE ; x
# [1] NA NA NA NA NA
class(x)
# [1] "integer"
y <- letters[1:5]
is.na(y) <- TRUE ; y
# [1] NA NA NA NA NA
class(y)
# [1] "character"
这篇关于在multiate_at()中使用case_When()重新编码具有不同类型NA的几列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文