我的数据框有9列和3198行。在其中一栏中,“NA'每82行重复一次。我试图用同一数据框中其他列的值替换缺少的值。让我用一个小数据集来说明:
df <- data.frame(a = LETTERS[1:6], b = rep(seq(1:3), 2))
df$b[1] <- 'NA'
df$b[4] <- 'NA'
> df
a b
1 A NA
2 B 2
3 C 3
4 D NA
5 E 2
6 F 3
for (i in 1: nrow(df)){
if ('NA' %in% df$b[i]){
df$b[i] <- paste("box", df$a[i])
}
}
> df
a b
1 A box A
2 B 2
3 C 3
4 D box D
5 E 2
6 F 3
代码适用于这个小数据集。我在较大的数据集中做完全相同的事情,但由于某种原因,缺失的值仍未被替换。知道可能会发生什么吗?这可能是一个奇怪的问题,因为我的代码在此处的示例数据集中工作,我无法发布实际数据集供您审阅。以下可能会有所帮助:
> str(dataset)
'data.frame': 3198 obs. of 8 variables:
$ Local Identifier : chr "NEZ0100" "NEZ0100-1" "NEZ0100-2" "NEZ0100-3" ...
$ Local System : chr "Freezerworks" "Freezerworks" "Freezerworks" "Freezerworks" ...
$ Parent ID : chr "NEZ0100" "NEZ0100" "NEZ0100" "NEZ0100" ...
$ Storage Type : chr "Box-9X9" "BoxPos" "BoxPos" "BoxPos" ...
$ Storage Label : chr NA "A1" "A2" "A3" ...
$ Capacity : int 81 1 1 1 1 1 1 1 1 1 ...
$ Movable : chr "Y" "N" "N" "N" ...
$ Storage Unit Order Number: int 0 1 2 3 4 5 6 7 8 9 ...
$ Storage Label中出现问题。如果您需要任何其他信息,请与我们联系。感谢。
答案 0 :(得分:4)
R使用NA
表示缺失值。请注意,NA
是一个特殊值,与字符值"NA"
不同。由于您的str(dataset)
显示NA
值没有引号,因此我们知道它是R的特殊NA
值,而不是字符串。所以对于你的例子,它更像是
df <- data.frame(a = LETTERS[1:6], b = rep(seq(1:3), 2))
df$b[1] <- NA
df$b[4] <- NA
您使用NA
而不是is.na()
来测试=='NA'
。此外,我们在这里不需要任何循环来替换NA
值,我们可以这样做
df$b[is.na(df$b)]<-paste("box", df$a[is.na(df$b)])
df
给了我们
a b
1 A box A
2 B 2
3 C 3
4 D box D
5 E 2
6 F 3
请注意,在此处使用paste
会将该列从数字转换为字符,但看起来您的实际“存储标签”列仍然是字符,因此不会更改任何内容。