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

Replace # with NA and convert values into numerics in R

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

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

这是我试过的:

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

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

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

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

有什么解决办法吗?

用正确的数据编辑

这是第二种方法:

  • 读取数据"as is"
  • 将 date-time 列从字符转换为日期时间
  • 假设其他列中的任何 non-numeric 条目 = 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 ...

使用基础 R 解决方案进行编辑

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

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

数据不正确的旧答案

您可以在将数据导入 R 时指定哪些值代表缺失值。一般来说,如果不确定数据,最好阅读 "as is",探索并找出该特定数据集的怪癖,然后回去修复它。

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

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 列转换为日期时间 class,具体取决于您下一步要做什么。