【发布时间】:2023-03-08 19:57:01
【问题描述】:
我有一个数据框 (df),其中包含 NA 和数字。我想在以下条件下对其进行规范化:
- 如果列仅包含
NA,则保持原样。 - 如果一列只包含一个数字,而该列中的其余值等于
NA,则将该值更改为1,并将NA(该列中的所有NA)更改为0。 - 如果列包含数字,则对其进行规范化。
我做了以下尝试,但没有成功。
normalize<-function(x) {
x <- as.numeric( as.character( x ))
if(sum(!is.na(x) == 1)) {
x[which(!is.na(x))] <- 1
x[which(is.na(x))] <- 0
return(x)
} else if(sum(!is.na(x) == 0)) {
x <- NA
return(x)
} else if(sum(!is.na(x) > 1)) {
y <- (x-min(x, na.rm=TRUE))/(max(x, na.rm=TRUE)-min(x, na.rm=TRUE))
return(y)
}
}
as.data.frame(lapply(df, normalize))
数据样本:
df <- data.frame(c(123,534,7567,2345,3456,3476,NA,765), c(NA,NA,NA,NA,NA,NA,NA,NA), c(NA,NA,NA,NA,NA,354,NA,NA))
【问题讨论】:
-
检查 if 中的括号。第一个标准将在所有 na 以外的所有内容上返回 true,第二个标准似乎是偶然的。目前 y 将是 1、NA 或值向量
(x_i - min(x)) / (range(x)我不认为这是意图 -
请说明您的条件。在您的问题中,我看到:(a)如果该列全部为 NA,请留下。 (文本和代码); (b) 如果它有一个非 NA 值,则将该值更改为 1 并将所有 NA 更改为 0(文本,代码中的错误); (c) 如果一列“包含数字”,则对其进行规范化(如果“包含数字”是指“所有其他情况”,文本和代码),但有问题,因为如果您的列有单个值的多个副本,您将除以0.
标签: r function nan na normalize