Поиск по сайту:

Как заменить значения с помощью `replace()` и `is.na()` в R


Введение

При анализе данных вам может потребоваться устранить отсутствующие значения, отрицательные значения или неточные значения, присутствующие в наборе данных. Эти проблемы можно решить, заменив значения на 0, NA или среднее значение.

В этой статье вы узнаете, как использовать функции replace() и is.na() в R.

Предпосылки

Для выполнения этого урока вам понадобятся:

  • R, установленный локально или на сервере.

Замена значений в векторе с помощью replace()

В этом разделе показано, как заменить значение в векторе.

Функция replace() в синтаксисе R включает вектор, индексный вектор и значения замены:

replace(target, index, replacement)

Сначала создайте вектор:

df <- c('apple', 'orange', 'grape', 'banana')
df

Это создаст вектор с яблоком, апельсином, виноградом и бананом:

Output
"apple" "orange" "grape" "banana"

Теперь давайте заменим второй элемент в списке:

dy <- replace(df, 2, 'blueberry')
dy

Это заменит оранжевый на черничный:

Output
"apple" "blueberry" "grape" "banana"

Теперь заменим четвертый элемент в списке:

dx <- replace(dy, 4, 'cranberry')
dx

Это заменит banana на cranberry:

Output
"apple" "blueberry" "grape" "cranberry"

Замена значений NA на 0 в R

Рассмотрим сценарий, в котором у вас есть фрейм данных, содержащий измерения:

    Ozone  Solar.R  Wind  Temp  Month  Day
1      41      190   7.4    67      5    1
2      36      118   8.0    72      5    2
3      12      149  12.6    74      5    3
4      18      313  11.5    62      5    4
5      NA       NA  14.3    56      5    5
6      28       NA  14.9    66      5    6
7      23      299   8.6    65      5    7
8      19       99  13.8    59      5    8
9       8       19  20.1    61      5    9
10     NA      194   8.6    69      5   10
11      7       NA   6.9    74      5   11
12     16      256   9.7    69      5   12

Вот данные в формате CSV:

Ozone,Solar.R,Wind,Temp,Month,Day
41,190,7.4,67,5,1
36,118,8.0,72,5,2
12,149,12.6,74,5,3
18,313,11.5,62,5,4
NA,NA,14.3,56,5,5
28,NA,14.9,66,5,6
23,299,8.6,65,5,7
19,99,13.8,59,5,8
8,19,20.1,61,5,9
NA,194,8.6,69,5,10
7,NA,6.9,74,5,11
16,256,9.7,69,5,12

Он содержит строку NA для \Not Available для ситуаций, когда данные отсутствуют.

Вы можете заменить значения NA на 0.

Сначала определите фрейм данных:

df <- read.csv('air_quality.csv')

Используйте is.na(), чтобы проверить, является ли значение NA. Затем замените значения NA на 0:

df[is.na(df)] <- 0
df

Фрейм данных теперь:

Output
Ozone Solar.R Wind Temp Month Day 1 41 190 7.4 67 5 1 2 36 118 8.0 72 5 2 3 12 149 12.6 74 5 3 4 18 313 11.5 62 5 4 5 0 0 14.3 56 5 5 6 28 0 14.9 66 5 6 7 23 299 8.6 65 5 7 8 19 99 13.8 59 5 8 9 8 19 20.1 61 5 9 10 0 194 8.6 69 5 10 11 7 0 6.9 74 5 11 12 16 256 9.7 69 5 12

Все вхождения NA во фрейме данных заменены.

Замена значений NA средним значением значений в R

В процессе анализа данных точность во многих случаях повышается за счет замены значений NA средним значением. Функция mean() вычисляет среднее значение.

Чтобы преодолеть эту ситуацию, значения NA заменяются средним значением остальных значений. Этот метод оказался жизненно важным для получения хорошей точности без потери данных.

Рассмотрим следующий набор входных данных со значениями NA:

    Ozone  Solar.R  Wind  Temp  Month  Day
1      41      190   7.4    67      5    1
2      36      118   8.0    72      5    2
3      12      149  12.6    74      5    3
4      18      313  11.5    62      5    4
5      NA       NA  14.3    56      5    5
6      28       NA  14.9    66      5    6
7      23      299   8.6    65      5    7
8      19       99  13.8    59      5    8
9       8       19  20.1    61      5    9
10     NA      194   8.6    69      5   10
11      7       NA   6.9    74      5   11
12     16      256   9.7    69      5   12
df <- read.csv('air_quality.csv')

Используйте is.na() и mean() для замены NA:

df$Ozone[is.na(df$Ozone)] <- mean(df$Ozone, na.rm = TRUE)

Во-первых, этот код находит все вхождения NA в столбце Ozone. Затем он вычисляет среднее значение всех значений в столбце Ozone, исключая значения NA с аргументом na.rm. Затем каждый экземпляр NA заменяется рассчитанным средним значением.

Затем round() значения до целых чисел:

df$Ozone <- round(df$Ozone, digits = 0)

Фрейм данных теперь:

Output
Ozone Solar.R Wind Temp Month Day 1 41 190 7.4 67 5 1 2 36 118 8.0 72 5 2 3 12 149 12.6 74 5 3 4 18 313 11.5 62 5 4 5 21 NA 14.3 56 5 5 6 28 NA 14.9 66 5 6 7 23 299 8.6 65 5 7 8 19 99 13.8 59 5 8 9 8 19 20.1 61 5 9 10 21 194 8.6 69 5 10 11 7 NA 6.9 74 5 11 12 16 256 9.7 69 5 12

Значения NA в столбце Ozone теперь заменены округленным средним значением значений в столбце Ozone (21).

Замена отрицательных значений на 0 или NA в R

В процессе анализа данных иногда вам может понадобиться заменить отрицательные значения во фрейме данных на 0 или NA. Это необходимо, чтобы избежать отрицательной тенденции результатов. Отрицательные значения, присутствующие в наборе данных, введут в заблуждение анализ и приведут к ложной точности.

Рассмотрим следующий набор входных данных с отрицательными значениями:

    count  entry1  entry2  entry3
 1      1     345    -234     345
 2      2      65     654     867
 3      3      23     345    3456
 4      4      87     876       9
 5      5    2345      34     867
 6      6     876      98      76
 7      7      35    -456     123
 8      8      87      98     345
 9      9    -765      67     765
10     10    4567     -87     234

Вот данные в формате CSV:

count,entry1,entry2,entry3
1,345,-234,345
2,65,654,867
3,23,345,3456
4,87,867,9
5,2345,34,867
6,876,98,76
7,35,-456,123
8,87,98,345
9,-765,67,765
10,4567,-87,234

Прочитайте CSV-файл:

df <- read.csv('negative_values.csv')

Замена отрицательных значений на 0

Используйте replace(), чтобы изменить отрицательные значения в столбце entry2 на 0:

data_zero <- df
data_zero$entry2 <- replace(df$entry2, df$entry2 < 0, 0) 
data_zero

Фрейм данных теперь:

Output
count entry1 entry2 entry3 1 1 345 0 345 2 2 65 654 867 3 3 23 345 3456 4 4 87 867 9 5 5 2345 34 867 6 6 876 98 76 7 7 35 0 123 8 8 87 98 345 9 9 -765 67 765 10 10 4567 0 234

Отрицательные значения в столбце entry2 были заменены на 0.

Замена отрицательных значений на NA

Используйте replace(), чтобы изменить отрицательные значения в столбце entry2 на NA:

data_na <- df
data_na$entry2 <- replace(df$entry2, df$entry2 < 0, NA)
data_na

Фрейм данных теперь:

Output
count entry1 entry2 entry3 1 1 345 NA 345 2 2 65 654 867 3 3 23 345 3456 4 4 87 867 9 5 5 2345 34 867 6 6 876 98 76 7 7 35 NA 123 8 8 87 98 345 9 9 -765 67 765 10 10 4567 NA 234

Отрицательные значения в столбце entry2 были заменены на NA.

Заключение

Замена значений во фрейме данных — удобный вариант, доступный в R для анализа данных. Используя replace() в R, вы можете переключать NA, 0 и отрицательные значения, когда это необходимо, чтобы очистить большие наборы данных для анализа.

Продолжите изучение с использованием sub() и gsub() в R.