标准化具有多个条件R的数据帧

时间:2019-05-08 13:57:26

标签: r function nan na normalize

我有一个数据帧(df),其中包含NA和数字。我要标准化以下条件:

  • 如果一列仅包含NA,则保持原样。
  • 如果一列仅包含一个数字,而该列中的其余值等于NA,则将该值更改为1NA(所有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))

2 个答案:

答案 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