将NA或其他<na>替换为数据框列中的内容或其他内容

时间:2016-11-26 23:14:23

标签: r replace na

我已经阅读了一些似乎相关的帖子,但很明显,一个Noob很难理解或做任何事情......

> df
  ID Area Address
1 NA    1    lane
2 11   NA    road
3 12    2    blvd
4 13    5    <NA>

> str(df)
'data.frame':   4 obs. of  3 variables:
 $ ID     : int  NA 11 12 13
 $ Area   : int  1 NA 2 5
 $ Address: Factor w/ 3 levels "blvd","lane",..: 2 3 1 NA

我希望能够 - 不仅仅是针对上面的数据框,而是针对具有更多行和更多列的更大数据帧 - 替换我选择的任何列(我通过列名称引用)所有出现的事件的

<NA>

我选择的元素来自

<NA> , NA, "foo", "", 0

以及执行替换的任何内容都不会在没有

时中断或给出错误
<NA>

替换。同样,我想对

进行类似的替换
NA

在我选择的任何列中没有破损或错误。

如果有技术原因可以解释为什么我不能按照我的建议行事,那么我可以做些什么来尽可能接近上面的内容(同时坚持数据框架 - 用其他东西来回转换是正确的,如果关于如何精确管理转换的答案非常明确 - 并且在某种意义上保留了因素,例如,地址列是一个因素,因此在替换后它应该仍然是一个因素。

我希望有技术上的原因可以解释为什么我不能按照我的建议行事(我对于不可能的事情感到困惑),所以我希望尽可能接近现实,并且某种善意的灵魂会解释我可以在多大程度上接近上述内容,以及如何准确地接近上述内容。

请帮助(如果没有详细的明确答案,请不要认为我可以理解。)

由于

2 个答案:

答案 0 :(得分:3)

如果没有制作整个矢量字符,则无法将字符串插入到数字或整数矢量中,但我们可以插入零代替NA,我们在下面执行此操作。我们还会将fill的默认"foo"作为新级别插入,以代替问题中显示的排序因子的NA。

1)查看最后可重复显示的df.orig,它有整数和因子列,以下内容适用于那些以及双数字列。对于数字(双精度和整数),我们分配0L,以便整数列不会更改为double。对于双列,0L将自动强制加倍。对于具有NA值的因子,我们将NA添加为最后一级,然后将其标签更改为fill。我们还会检查是否存在任何NA级别,如果是,请将其替换为fill。人们通常不会发现这两种情况。如果需要转换问题中未显示的其他类,则需要扩展下面的代码。

df <- df.orig

# numeric (integer and double)
isNum <- sapply(df, is.numeric)
na2zero <- function(v, ...) replace(v, is.na(v), 0L)
df[isNum] <- lapply(df[isNum], na2zero)

# factor
isFactor <- sapply(df, is.factor)
na2fill <- function(v, fill = "foo", ...) { 
      # handle NA values
      if (any(is.na(v))) {
         v <- addNA(v)
         levels(v)[nlevels(v)] <- fill
      }
      # handle NA levels
      if (any(is.na(levels(v)))) levels[is.na(levels(v))] <- fill
      v 
}
df[isFactor] <- lapply(df[isFactor], na2fill)

,并提供:

> df
  ID Area Address
1  0    1    lane
2 11    0    road
3 12    2    blvd
4 13    5     foo

2)或者,我们可以使用S3来更紧凑地执行na2zerona2fill来自(1)。

rmNA <- function(v, ...) UseMethod("rmNA")
rmNA.numeric <- na2zero
rmNA.factor <- na2fill
rmNA.default <- function(v, ...) v # do not process other classes

df <- df.orig
df[] <- lapply(df, rmNA)

注意: df的可重现形式为:

df.orig <- 
structure(list(ID = c(NA, 11L, 12L, 13L), Area = c(1L, NA, 2L, 
5L), Address = structure(c(2L, 3L, 1L, NA), .Label = c("blvd", 
"lane", "road"), class = "factor")), .Names = c("ID", "Area", 
"Address"), class = "data.frame", row.names = c("1", "2", "3", 
"4"))

答案 1 :(得分:0)

如果您的数据框名称为df,就像您在问题中显示的那样,请输入:

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

只需了解您的数据框的名称,如果它不是df,只需将df替换为您与数据框架对齐的名称。