Как заменить значения с помощью `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.