给定数据:
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"
if替换colc < 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()
用来将输入向量转换为NA,而这些NA将与输入向量具有相同的类型。例如:
x <- 1:5
is.na(x) <- T ; x
# [1] NA NA NA NA NA
class(x)
# [1] "integer"
y <- letters[1:5]
is.na(y) <- T ; y
# [1] NA NA NA NA NA
class(y)
# [1] "character"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句