我已经阅读了一些似乎相关的帖子,但很明显,一个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
在我选择的任何列中没有破损或错误。
如果有技术原因可以解释为什么我不能按照我的建议行事,那么我可以做些什么来尽可能接近上面的内容(同时坚持数据框架 - 用其他东西来回转换是正确的,如果关于如何精确管理转换的答案非常明确 - 并且在某种意义上保留了因素,例如,地址列是一个因素,因此在替换后它应该仍然是一个因素。
我希望有技术上的原因可以解释为什么我不能按照我的建议行事(我对于不可能的事情感到困惑),所以我希望尽可能接近现实,并且某种善意的灵魂会解释我可以在多大程度上接近上述内容,以及如何准确地接近上述内容。
请帮助(如果没有详细的明确答案,请不要认为我可以理解。)
由于
答案 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来更紧凑地执行na2zero
和na2fill
来自(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替换为您与数据框架对齐的名称。