使用 R tidyverse 将双精度数转换为整数

问题描述 投票:0回答:2

以下如何在 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)

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

%>%

r type-conversion tidyverse dplyr
2个回答
3
投票

我认为您遇到的问题是

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))))

0
投票

我在尝试在列上运行“uncount”时遇到了同样的问题 已从百分比转换为绝对数字,因此它实际上是一个整数,但从技术上讲仍然是一个双精度数

# A tibble: 18 × 2
   MobileOS      OS_2010
   <fct>           <dbl>
 1 Android          1190
 2 BlackBerry OS    2013
 3 Brew                0
 4 iOS              5358
 5 LG                 52
 6 Linux               0
 7 Nintendo           79
 8 Nintendo 3DS        0
 9 Nokia Unknown       0
10 Other              77
11 Playstation       218
12 Samsung           174
13 Series 40           0
14 Sony Ericsson      43
15 SymbianOS         141
16 Unknown           433
17 webOS             117
18 Windows           105

显然在过去你可以逃脱惩罚

所以我尝试了旧的方法来将双精度强制为整数

df %<>%
  mutate_at(vars(OS_2010), as.integer) %>%
  print()

这有效,“不可计数”也有效

然后我重新解决了这个问题并使用了现代方法

df %<>%
  mutate(across(
    .cols = matches('OS_2010'),
    .fns = ~ as.integer(.x)))

这也有效。

© www.soinside.com 2019 - 2024. All rights reserved.