以下如何在 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)
有人可以向我解释错误的原因以及如何转换为整数。理想情况下,我正在寻找一种对管道操作员友好的解决方案
%>%
。
我认为您遇到的问题是
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))))
我在尝试在列上运行“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)))
这也有效。