用NA替换#并将值转换为R中的数字

时间:2019-05-07 22:06:11

标签: r replace numeric na

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

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

这是我尝试过的:

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

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

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

用NA替换缺少的值后,我想将所有列(而不是第一列)转换为数值以计算均值。

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

1 个答案:

答案 0 :(得分: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列转换为datetime类,具体取决于下一步要做什么。