我有一个数据框 (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))
最佳答案
您的条件无法正常工作:例如 sum(!is.na(x)==1)
不是您想要的,因为您想要 sum
超过 !is.na(x)
而不是 !is.na(x) == 1
之和。
以下内容可以完成这项工作:
df <- data.frame(a = c(123,534,7567,2345,3456,3476,NA,765), b = c(NA,NA,NA,NA,NA,NA,NA,NA), c = c(NA,NA,NA,NA,NA,354,NA,NA))
normalize<-function(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))
a b c
[1,] 0.00000000 NA 0
[2,] 0.05519956 NA 0
[3,] 1.00000000 NA 0
[4,] 0.29848601 NA 0
[5,] 0.44773573 NA 0
[6,] 0.45042249 NA 1
[7,] NA NA 0
[8,] 0.08623168 NA 0
关于r - 规范化具有多个条件的数据帧,R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56042510/