R语言教程:使用replace()和is.na()函数高效处理缺失值的完整指南

引言

在数据分析中,你可能需要解决数据集中存在的缺失值、负值或不准确值的问题。这些问题可以通过用0、NA或均值来替代这些值来解决。

在这篇文章中,你将探索如何在R中使用replace()和is.na()函数。

先决条件

完成这个教程,您将需要:

  • 在本地或服务器上安装R。

用replace()替换向量中的值

本节将展示如何在向量中替换一个值。

R语法中的replace()函数包括向量、索引向量和替换值。

replace(target, index, replacement)

首先,创建一个向量:

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

这将创建一个包含苹果,橙子,葡萄和香蕉的向量。

输出

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

现在,让我们把列表中的第二项替换掉。

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

这将用蓝莓取代橙子。

输出

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

现在,我们将替换列表中的第四项。

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

这将用蔓越莓替代香蕉。

输出

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

在R中,用0替换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

这是以CSV格式呈现的数据。

空气质量.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,用于表示数据缺失的情况。

你可以用0替换掉NA值。

首先,定义数据框架:

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

使用 is.na() 函数来检查一个值是否为 NA。然后,将 NA 值替换为 0。

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

数据框架现在是:

输出

   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的出现都已经被替换。

在R中用值的平均值替换NA值

在数据分析过程中,通过用平均值替换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)

首先,此代码查找Ozone列中所有NA的出现次数。接下来,它计算Ozone列中所有值的均值 – 排除使用na.rm参数的NA值。然后,将每个NA的实例替换为计算得出的均值。

然后将值四舍五入到整数位。

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

现在数据框是如下:

   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

现在,将Ozone列中的NA值替换为Ozone列数值的四舍五入均值(21)。

在R中使用0或NA替换负值

在数据分析过程中,有时候你会希望用0或NA替换数据框中的负值。这是为了避免结果呈现负趋势。数据集中存在的负值会误导分析,并产生错误的准确性。

考虑以下具有负值的输入数据集:

负值数据表.csv
    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,876,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

现在的数据框架是:

   count entry1 entry2 entry3
1      1    345      0    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      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

现在的数据框是:

输出结果

   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中,替换数据框中的值是进行数据分析的一个方便选项。使用R中的replace()函数,您可以在适当的时候将NA、0和负值进行转换,以清理大型数据集进行分析。

继续学习如何在R中使用sub()和gsub()函数。

bannerAds