虽然我很欣赏if_else()
和case_when()
所做的类型检查,因为它可以捕获危险的错误,但我发现整数和数字之间缺乏自动转换非常麻烦。
例如,在一项调查中,我使用一个变量(此处y
)表示为每周每天或每周的小时数。 时间单位存储在变量x
。 为了计算每天的小时数,可以在需要时使用if_else
进行除法。 不幸的是,当y
的类型integer
,以下代码不起作用,我使用read.dbf
导入的 dBase 文件就是这种情况。
library(dplyr)
df <- data.frame(x=c("Week", "Day"), y=c(1L, 2L))
mutate(df, z = if_else(x == "Week", y/7, y))
# Result:
Error in mutate_impl(.data, dots) :
`false` has type 'integer' not 'double'
(实际上,条件更复杂,所以我想使用case_when
而不是嵌套的if_else
。)
是否可以允许将整数列转换为数字? 在这种情况下不存在生成错误数据的风险。 一般来说, numeric
和integer
之间的区别在 R 中是相当隐蔽的,所以新用户很可能会被这个错误所迷惑。 这么简单的操作,不得不向新人解释,我的心情很不好。
你现在可以用as.numeric(y)
代替y
吗?
@hadley :我们是否过于严格,没有在if_else()
和case_when()
中将整数自动转换为数字?
您现在可以使用 as.numeric(y) 而不是 y 吗?
是的,这当然有效,但它很麻烦,而且对新手来说很混乱。
是的,这是一个已知问题,将(最终)在 vctrs 中修复。
最有用的评论
是的,这是一个已知问题,将(最终)在 vctrs 中修复。