Dplyr: 允许在 if_else() 和 case_when() 中整数和数字之间的静默转换

创建于 2017-01-18  ·  3评论  ·  资料来源: tidyverse/dplyr

虽然我很欣赏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 。)

是否可以允许将整数列转换为数字? 在这种情况下不存在生成错误数据的风险。 一般来说, numericinteger之间的区别在 R 中是相当隐蔽的,所以新用户很可能会被这个错误所迷惑。 这么简单的操作,不得不向新人解释,我的心情很不好。

最有用的评论

是的,这是一个已知问题,将(最终)在 vctrs 中修复。

所有3条评论

你现在可以用as.numeric(y)代替y吗?

@hadley :我们是否过于严格,没有在if_else()case_when()中将整数自动转换为数字?

您现在可以使用 as.numeric(y) 而不是 y 吗?

是的,这当然有效,但它很麻烦,而且对新手来说很混乱。

是的,这是一个已知问题,将(最终)在 vctrs 中修复。

此页面是否有帮助?
0 / 5 - 0 等级