r - 替换 R 数据框中的无限值 [为什么 `is.infinite()` 的行为不像 `is.na()`]
问题描述
library(tidyverse)
df <- tibble(col1 = c("A", "B", "C"),
col2 = c(NA, Inf, 5))
#> # A tibble: 3 x 2
#> col1 col2
#> <chr> <dbl>
#> 1 A NA
#> 2 B Inf
#> 3 C 5
我可以使用基本的 Ris.na()
函数轻松地将NA
s替换为0
s,如下所示:
df %>% replace(is.na(.), 0)
#> # A tibble: 3 x 2
#> col1 col2
#> <chr> <dbl>
#> 1 A 0
#> 2 B Inf
#> 3 C 5
如果我尝试用is.infinite()
中断来复制这个逻辑:
df %>% replace(is.infinite(.), 1)
#> Error in is.infinite(.) : default method not implemented for type 'list'
看看这个关于 Inf 和 R 数据帧的旧答案,我可以将下面显示的解决方案组合在一起。这需要我的原始数据框,然后全部NA
变成. 为什么不表现得像什么(也许)是做我想做的更好的方法?0
Inf
1
is.infinite()
is.na()
df %>%
replace(is.na(.), 0) %>%
mutate_if(is.numeric, list(~na_if(abs(.), Inf))) %>% # line 3
replace(is.na(.), 1)
#> # A tibble: 3 x 2
#> col1 col2
#> <chr> <dbl>
#> 1 A 0
#> 2 B 1
#> 3 C 5
解决方案
is.infinite
期望输入'x'是原子向量,根据?is.infinite
x- 要测试的对象:默认方法处理原子向量。
而?is.na
可以将向量、矩阵、data.frame 作为输入
要测试的 R 对象:is.na 和 anyNA 的默认方法处理原子向量、列表、对列表和 NULL
此外,通过检查methods
,
methods('is.na')
#[1] is.na.data.frame is.na.data.table* is.na.numeric_version is.na.POSIXlt is.na.raster* is.na.vctrs_vctr*
methods('is.infinite') # only for vectors
#[1] is.infinite.vctrs_vctr*
我们可以修改replace
代码中的
library(dplyr)
df %>%
mutate_if(is.numeric, ~ replace_na(., 0) %>%
replace(., is.infinite(.), 1))
# A tibble: 3 x 2
# col1 col2
# <chr> <dbl>
#1 A 0
#2 B 1
#3 C 5
推荐阅读
- python - django.db.utils.OperationalError:没有这样的表
- entity-framework - 使用实体框架的第二个唯一列
- rest - Customization YCommerceWebService - Webroot "/rest" not working anymore
- c++ - 从类函数显示动态 C 字符串的段错误 11
- python - 计算按顺序出现的相同字符
- perl - 获取主机名的所有 IP 地址
- xpath - Xpath 和 DOMDocument 节点
- bash - 从远程服务器调用的脚本无法正确运行服务
- model-view-controller - 为什么模型在MVC模式中直接更新视图?
- c - 为什么这会在终止时给出(非零)错误代码?