使用R中的paste()替换NA

时间:2014-07-05 06:30:43

标签: r na

我的数据框有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中出现问题。如果您需要任何其他信息,请与我们联系。感谢。

1 个答案:

答案 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会将该列从数字转换为字符,但看起来您的实际“存储标签”列仍然是字符,因此不会更改任何内容。