【问题标题】:Replace # with NA and convert values into numerics in R用 NA 替换 # 并将值转换为 R 中的数字
【发布时间】:2019-05-07 22:06:11
【问题描述】:

我的数据框有问题。缺失的值用 # 标记,我找不到自动用 NA 替换它们的方法。

这是我的数据框:https://gofile.io/?c=BfpgbC

这是我尝试过的:

library(naniar)
df_new= testframe %>% replace_with_na(replace = list(NO2_Königsplatz = "#"))

testframe[testframe== "#"] <- NA

两者都不起作用。当我手动替换每个值时,它可以工作,但这不是一个选项,因为它需要太长时间。

用 NA 替换缺失值后,我想将所有列(不是第一列)转换为数字来计算平均值。

有什么办法解决这个问题吗?

【问题讨论】:

  • 请提供 MCVE stackoverflow.com/help/mcve
  • 我上传了数据框,因为我总是无法重现它。
  • 查看您的数据:一些缺失值表示为" # ",但至少有一列PM10_Bourgesplatz 包含" -"
  • 哦,那是真的。但这不应该是替换代码不起作用的原因。至少 # 应该没有了,但它们没有。
  • # 周围有空格,这就是您的代码不起作用的原因。

标签: r replace na numeric naniar


【解决方案1】:

使用正确的数据进行编辑

这是第二种方法:

  • “按原样”读取数据
  • 将日期时间列从字符转换为日期时间
  • 假设其他列中的任何非数字条目 = NA
  • 将所有其他列从字符转换为整数

最后一步将生成有关强制 NA 值的警告,可以忽略。我们可以使用lubridatedplyr 包:

library(dplyr)
library(lubridate)

dat <- read.table("AUG-2017-Air.dat", 
                  stringsAsFactors=FALSE) %>% 
  mutate(Zeitpunkt = dmy_hm(Zeitpunkt)) %>% 
  mutate_if(is.character, as.integer)

请注意,除非另有说明,否则时区假定为 UTC。

结果:

str(dat)

'data.frame':   8760 obs. of  13 variables:
 $ Zeitpunkt        : POSIXct, format: "2017-01-01 01:00:00" "2017-01-01 02:00:00" "2017-01-01 03:00:00" "2017-01-01 04:00:00" ...
 $ NO2_Bourgesplatz : int  31 31 29 30 29 28 27 29 28 25 ...
 $ NO2_Karlstraße   : int  34 35 31 31 31 32 38 35 33 29 ...
 $ NO2_Königsplatz  : int  29 29 28 28 27 27 26 28 28 23 ...
 $ NO2_LfU          : int  31 31 29 28 27 26 25 23 22 24 ...
 $ O3_Bourgesplatz  : int  6 5 2 2 2 2 2 2 2 8 ...
 $ O3_LfU           : int  4 3 3 3 3 3 3 3 3 5 ...
 $ PM10_Bourgesplatz: int  455 417 106 90 87 93 85 79 91 77 ...
 $ PM10_Karlstraße  : int  203 75 58 53 55 60 51 45 48 48 ...
 $ PM10_Königsplatz : int  215 75 62 51 64 63 69 51 50 64 ...
 $ PM10_LfU         : int  376 321 62 101 61 112 123 112 118 147 ...
 $ PM25_Bourgesplatz: int  267 308 100 87 87 94 88 80 92 79 ...
 $ PM25_LfU         : int  160 112 48 62 50 65 62 66 65 76 ...

使用 BASE R 解决方案进行编辑

dat <- read.table("AUG-2017-Air.dat", 
                  stringsAsFactors=FALSE)

dat[2:13] <- lapply(dat[2:13], as.numeric)

数据不正确的旧答案

您可以在将数据导入 R 时指定哪些值表示缺失值。一般而言,如果不确定数据,最好按“原样”阅读,探索然后找出该特定数据集的怪癖,然后返回并修复它。

对于您问题中链接的数据,这应该有效:

testframe <- read.table("testframe.dat", 
                        sep = "", 
                        na.strings = c("    # ", 
                                       "   -"), 
                        stringsAsFactors=FALSE)

结果:

str(testframe)

'data.frame':   1095 obs. of  13 variables:
 $ Zeitpunkt        : chr  "01.01.2017 07:00" "01.01.2017 14:00" "01.01.2017 21:00" "02.01.2017 07:00" ...
 $ NO2_Bourgesplatz : int  27 22 41 22 20 36 35 24 23 12 ...
 $ NO2_Karlstraße   : int  38 49 53 38 54 45 47 61 32 19 ...
 $ NO2_Königsplatz  : int  26 25 46 26 35 30 33 31 19 8 ...
 $ NO2_LfU          : int  25 16 36 19 13 26 24 17 18 9 ...
 $ O3_Bourgesplatz  : int  2 22 2 23 32 12 8 41 36 55 ...
 $ O3_LfU           : int  3 31 4 28 48 22 23 55 47 67 ...
 $ PM10_Bourgesplatz: int  85 54 74 32 18 11 18 11 13 6 ...
 $ PM10_Karlstraße  : int  51 37 69 34 21 15 23 17 17 11 ...
 $ PM10_Königsplatz : int  69 36 59 26 21 12 18 15 13 8 ...
 $ PM10_LfU         : int  123 35 68 30 12 6 16 11 14 6 ...
 $ PM25_Bourgesplatz: int  88 61 53 32 19 12 15 11 11 6 ...
 $ PM25_LfU         : int  62 42 61 24 15 9 15 11 12 5 ...

您还可以考虑将Zeitpunkt 列转换为日期时间类,具体取决于您接下来要执行的操作。

【讨论】:

  • 谢谢!那几乎可以工作了。在所有 _LfU 列中,我在几列中仍然有一些 #! # 周围可能有不同的空格?你是怎么发现的?
  • 从您的问题链接的数据文件不会发生。我会考虑并编辑答案。
  • 哦,好吧,可能是这样。我上面链接的数据框与我使用的不是 1:1 相同。这是正确的:gofile.io/?c=BfpgbC
  • 编辑了答案。
  • 谢谢,但现在我收到一个错误:mutate_impl(.data, dots) 中的错误:评估错误:as_dictionary() 自 rlang 0.3.0 起已失效。请改用as_data_pronoun()
猜你喜欢
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2022-01-16
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多