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格式呈现的数据。
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替换数据框中的负值。这是为了避免结果呈现负趋势。数据集中存在的负值会误导分析,并产生错误的准确性。
考虑以下具有负值的输入数据集:
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()函数。