【问题标题】:Converting double to integers using R tidyverse使用 R tidyverse 将 double 转换为整数
【发布时间】:2021-08-18 23:07:06
【问题描述】:

How to convert column types in R tidyverse 之后,我正在尝试将双精度数(数字)转换为整数。

例如,使用虹膜数据:

iris1 <- iris %>%
  mutate_at(vars(Petal.Length), integer)

上面抛出了一个错误,尽管遵循了推荐的故障排除方法,我还是无法理解:

Error: Problem with `mutate()` column `Petal.Length`.
ℹ `Petal.Length = (function (length = 0L) ...`
.x invalid 'length' argument

使用同一行代码转换为因子,结果很好:

iris1 <- iris %>%
mutate_at(vars(Petal.Length), factor)
class(iris1$Petal.Length)

有人可以向我解释错误的原因以及如何转换为整数。理想情况下,我正在寻找对管道操作员友好的解决方案%&gt;%

【问题讨论】:

  • integer 更改为as.integer 即显式强制转换为整数

标签: r type-conversion tidyverse dplyr


【解决方案1】:

我认为您遇到的问题是integer() 创建了一个整数类型的向量,它只是一个空的整数占位符。你想要的是as.integer(),它接受一个现有的数字向量并将每个元素强制转换为一个整数。这是一个很小的区别,所以很容易错过。这是您实施了修复的代码:

技术上正确的答案

iris1 <- iris %>%
  mutate_at(vars(Petal.Length), as.integer) # note the AS.INTERGER()

更现代的方法

您可能有兴趣知道mutate_at() 已被更现代的mutate(across(...))) 方法所取代。根据您的目标,您可能更喜欢使用dplyr 解决此问题的更现代的方法:

iris2 <- iris %>% 
  mutate(across(
    .cols = matches('Petal.Length'),
    .fns = ~ as.integer(.x)))

不要忘记四舍五入

提醒一下,将某些内容强制转换为整数会丢弃任何十进制值,这基本上就像向下舍入每个值到最接近的(较低的)整数。您可能希望先对数字进行四舍五入,然后将它们强制转换为整数格式,具体取决于此代码的其他目标。

iris1 <- iris %>%
  mutate_at(vars(Petal.Length), ~ as.integer(round(.x)))

iris2 <- iris %>% 
  mutate(across(
    .cols = matches('Petal.Length'),
    .fns = ~ round(as.integer(.x))))

【讨论】:

  • 感谢您提供如此出色而详细的答案。建议的解决方案完美运行。我是 tidyverse 工作流程的新手,所以对新的 mutate 选项的解释也很有帮助。
  • 可能值得一提的是cross()可以和where()结合,对数据进行子集化,进入函数,如iris %&gt;% mutate(across(where(is.numeric), ~ as.integer(round(.x))))
  • 谢谢!我很高兴有机会提供帮助。如果您觉得答案满足您的需求,也可以随意选择它作为解决方案(当然没有压力)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 2012-02-24
  • 2019-01-08
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多