【问题标题】:How to change Inf or NA values in a data frame to a different value in R [duplicate]如何将数据框中的 Inf 或 NA 值更改为 R 中的不同值
【发布时间】:2019-12-12 12:52:20
【问题描述】:

如何遍历数据框并检查每个单元格中的 Inf 和 NA 值。如果单元格中有 Inf 或 NA 值,则将其更改为值 0。

这是一个示例数据框

testdf <- data.frame(b1 = c(1,Inf,5,7,8,9,200,736, Inf, Inf), 
b2 = c(2,3,Inf, NA,4,78,23,567,9114,94), 
b3 = c(23,45,86,1236,78,Inf,324,2100,49,10))

> testdf
    b1   b2   b3
1    1    2   23
2  Inf    3   45
3    5  Inf   86
4    7   NA 1236
5    8    4   78
6    9   78  Inf
7  200   23  324
8  736  567 2100
9  Inf 9114   49
10 Inf   94   10

【问题讨论】:

  • 您可以使用testdf[sapply(testdf, is.infinite) | is.na(testdf)] &lt;- 0。除了is.infinite() 没有 data.frame 方法之外,这是一个常见的骗局。
  • 我警告不要随意将NA 转换为0,因为这会改变数据的含义。例如,NA 表示 “我没有数据”“这不适用”,而找到 0 表示 “有数据对于这个单元格,它是零”。这显然是上下文相关的,但我很少将非数字转换为数字,无论是 0、1 还是其他数字。 (估算的行为有时是必要的,当然。)

标签: r


【解决方案1】:

这是一种使用基础 R 中的 lapply 的方法 -

testdf[] <- lapply(testdf, function(x) {
  replace(x, is.na(x) | is.infinite(x), 0)
})

    b1   b2   b3
1    1    2   23
2    0    3   45
3    5    0   86
4    7    0 1236
5    8    4   78
6    9   78    0
7  200   23  324
8  736  567 2100
9    0 9114   49
10   0   94   10

感谢@thelatemail,这是一个简化版本,考虑到!is.finite(c(Inf,NA)) 为两者返回TRUE -

testdf[] <- lapply(testdf, function(x) replace(x, !is.finite(x), 0))

使用@H1 评论中的解决方案的另一种方式-

testdf[sapply(testdf, Negate(is.finite))] <- 0

【讨论】:

  • !is.finite(c(Inf,NA)) 返回 2 TRUEs 所以你可以单独使用它 - testdf[] &lt;- lapply(testdf, function(x) replace(x, !is.finite(x), 0)) 我想。
猜你喜欢
  • 2021-09-25
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 2021-08-30
  • 1970-01-01
  • 2019-04-03
相关资源
最近更新 更多