我有一个数据帧(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))
答案 0 :(得分:2)
您的条件无法正常运行:例如,sum(!is.na(x)==1)
不是您想要的,因为您希望sum
超过!is.na(x)
,而不是!is.na(x) == 1
的总和。 / p>
以下内容可以完成这项工作:
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
答案 1 :(得分:0)
normalize<-function(x) {
sapply(x, function(y) {if(all(is.na(y))) {y}
else if(sum(!is.na(y))!=1) {helper<- (y-min(y, na.rm=TRUE))/(max(y, na.rm=TRUE)-min(y, na.rm=TRUE))
helper}
else if(sum(!is.na(y))==1) {helper<-ifelse(is.na(y),0,1)
helper}
})
}
结果:
normalize(df)
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