Замените # на NA и преобразуйте значения в числа в R - PullRequest
0 голосов
/ 08 мая 2019

У меня проблема с моим фреймом данных. Недостающие значения помечены #, и я не могу найти способ автоматически заменить их на NA.

Вот мой фрейм данных: https://gofile.io/?c=BfpgbC

Вот что я пробовал:

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

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

Оба не работают. Когда я вручную заменяю каждое значение, оно работает, но это не вариант, потому что это занимает слишком много времени.

После замены отсутствующих значений на NA я хочу преобразовать все столбцы (не 1-й столбец) в числовые значения для вычисления среднего значения.

Есть идеи, как это решить?

1 Ответ

1 голос
/ 08 мая 2019

РЕДАКТИРОВАТЬ С ПРАВИЛЬНЫМИ ДАННЫМИ

Вот второй подход:

  • прочитать данные "как есть"
  • преобразовать дату-временной столбец из символа в дату-время
  • предполагает, что любая нечисловая запись в других столбцах = NA
  • преобразует все остальные столбцы из символа в целое число

последний шаг будет генерировать предупреждения о принудительных значениях NA, которые можно игнорировать.Мы можем использовать пакеты lubridate и dplyr:

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, в зависимости от того, что вы хотите сделатьследующий.

...