r - 规范化具有多个条件的数据帧,R

标签 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))

最佳答案

您的条件无法正常工作:例如 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/

相关文章:

python - Numpy 整数 nan

javascript 计算不起作用一直返回 NaN

plot.window(...) 中的 R 错误需要有限的 'xlim' 值

r - 在 curl 中发送 json 文件并使用管道工在 R 中接收它

r - 只安装这个包会加速 R 吗?

c++ - 用户定义数组的函数

c++ - 简单的功能大小;了解指针与指针的区别

调用函数指针(语法)

c# - 与 Double.NaN 相等

r - 从拉普拉斯分布生成随机数