我有多个列的数据,它们的名称相似,但属于不同的类。我需要用0
替换所有的NA
,但保留columns类,因为不同的字符串将在以后被赋予其他数值。
这是示例数据:
qdf = data.frame(bicep_wt = c("black band", "5", NA),
tricep_wt = c(2,NA,3))
这是我尝试将NA改为0的结果:
mutate(qdf, across(contains("wt"), ~case_when(is.numeric(.x) ~ tidyr::replace_na(., 0),
is.character(.x) ~ tidyr::replace_na(., "0"))))
我收到错误:
Error in `mutate()`:
i In argument: `across(...)`.
Caused by error in `across()`:
! Can't compute column `bicep_wt`.
Caused by error in `case_when()`:
! Failed to evaluate the right-hand side of formula 1.
Caused by error in `vec_assign()`:
! Can't convert `replace` <double> to match type of `data` <character>.
相同错误:
mutate(qdf, across(contains("wt"), ~case_when(is.numeric(.x) ~ tidyr::replace_na(.x, 0),
is.character(.x) ~ tidyr::replace_na(.x, "0"))))
4条答案
按热度按时间z18hc3ub1#
虽然“类安全”通常是一件好事,但可以有利地使用非类安全的函数。
所谓“类安全”,我的意思是保证类从表达式返回。比如说
第一个调用是不明确的,因为
yes=
是类数字,而no=
是类字符。一个类安全的函数应该抱怨这一点,如请注意,
ifelse
和replace
是 * 非 * 类安全的,但在这种情况下,根据您的需求,它是可以接受的。5tmbdcev2#
您可以将条件传递到
replace_na
内部:结果:
Obs:它可以与
ifelse()
或``if()
一起工作。slmsl1lt3#
t9aqgxwy4#
如果您不知道您的列将仅为数字或字符,您可以做一个版本,无论如何都将替换正确的NA类型。
1)带循环
2)带函数和
lapply()