【问题标题】:How to turn NaNs in a data frame into NAs如何将数据框中的 NaN 转换为 NA
【发布时间】:2014-09-20 17:09:42
【问题描述】:

我希望并担心这只是一个单一的答案,并且为不得不问它而感到尴尬:

由于使用 reshape2 转换数据框,我有一个大数据框,其第一行如下:

  ukgridcode      x       y year     pm10 pm2.5      no2      nox  co so2 ozone benzene
1      56361 460500 1218500 2001 8.583796   NaN 2.375508 3.031918 NaN NaN   NaN     NaN
2      57051 460500 1217500 2001 8.584764   NaN 2.368387 3.022830 NaN NaN   NaN     NaN
3      57052 461500 1217500 2001 8.587392   NaN 2.383438 3.042039 NaN NaN   NaN     NaN
4      57054 463500 1217500 2001 8.590163   NaN 2.455386 3.133869 NaN NaN   NaN     NaN
5      57741 460500 1216500 2001 8.588822   NaN 2.375839 3.032340 NaN NaN   NaN     NaN
6      57742 461500 1216500 2001 8.592360   NaN 2.394949 3.056732 NaN NaN   NaN     NaN

我想将每个 NaN 转换为 NA。到目前为止,我已经尝试过:

d2 <- d[is.nan(d)] <- NA
d2 <- d[!is.finite(d)] <- NA
d2 <- apply(d, 2, function (x) x[is.nan(x)] <- NA) # also tried row-wise (1)

但到目前为止还没有成功。

非常感谢您的解决方案。

【问题讨论】:

  • 为什么不用dcastfill参数?
  • 谢谢。我仍在学习 Wickhamese 并将查看填充参数。下面的答案似乎暂时有效

标签: r dataframe apply nan na


【解决方案1】:

试试

d[sapply(d, is.nan)] <- NA


#   ukgridcode      x       y year     pm10 pm2.5      no2      nox co so2 ozone benzene
# 1      56361 460500 1218500 2001 8.583796    NA 2.375508 3.031918 NA  NA    NA      NA
# 2      57051 460500 1217500 2001 8.584764    NA 2.368387 3.022830 NA  NA    NA      NA
# 3      57052 461500 1217500 2001 8.587392    NA 2.383438 3.042039 NA  NA    NA      NA
# 4      57054 463500 1217500 2001 8.590163    NA 2.455386 3.133869 NA  NA    NA      NA
# 5      57741 460500 1216500 2001 8.588822    NA 2.375839 3.032340 NA  NA    NA      NA
# 6      57742 461500 1216500 2001 8.592360    NA 2.394949 3.056732 NA  NA    NA      NA

或使用data.table

library(data.table)
setDT(d)[, lapply(.SD, function(x) ifelse(is.nan(x), NA, x))]

或者看看@Rolands 评论

【讨论】:

    【解决方案2】:

    你可以试试:

     is.nan(d$pm2.5)
     #[1] TRUE TRUE TRUE TRUE TRUE TRUE
    
     d[d=="NaN"] <- NA
     d
     #    ukgridcode      x       y year     pm10 pm2.5      no2      nox co so2 ozone
     #1      56361 460500 1218500 2001 8.583796    NA 2.375508 3.031918 NA  NA    NA
     #2      57051 460500 1217500 2001 8.584764    NA 2.368387 3.022830 NA  NA    NA
     #3      57052 461500 1217500 2001 8.587392    NA 2.383438 3.042039 NA  NA    NA
     #4      57054 463500 1217500 2001 8.590163    NA 2.455386 3.133869 NA  NA    NA
     #5      57741 460500 1216500 2001 8.588822    NA 2.375839 3.032340 NA  NA    NA
     #6      57742 461500 1216500 2001 8.592360    NA 2.394949 3.056732 NA  NA    NA
     #  benzene
     #1      NA
     #2      NA
     #3      NA
     #4      NA
     #5      NA
     #6      NA
    

    【讨论】:

    • 嗯很有趣...我不知道你可以用NaN 做到这一点。我认为它不会像d[d=="NA"] &lt;- 1 这样的东西不起作用
    • NA 是一个非常奇怪的生物。它的类是logicalNA == "NA" 返回NA,而TRUE(哪个类也是logical)工作TRUE == "TRUE" 返回TRUE
    • 是的,class(NaN)#[1] "numeric",但是 d==NaN 不起作用
    • 是的,我知道class(NaN)numeric 这就是为什么将NATRUE 进行比较的原因:)
    【解决方案3】:

    如果数据框可用作 csv 文件,则正则表达式 find NaN replace with NA 将在带有正则表达式的文本编辑器中工作(例如在 notepad++ 中)

    【讨论】:

      【解决方案4】:
      d[is.na(d)]<-NA
      

      问题是is.nan 没有实现数据帧的方法,但is.na 有(is.na.data.frame)。由于is.na(NaN) 返回 TRUE,因此上述方法有效。

      【讨论】:

        猜你喜欢
        • 2012-03-25
        • 2018-01-04
        • 2018-08-04
        • 2019-02-28
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 2020-02-16
        • 2020-01-07
        相关资源
        最近更新 更多