归一化具有多个条件的数据帧,R

Posted

技术标签:

【中文标题】归一化具有多个条件的数据帧,R【英文标题】:Normalizing a dataframe having several conditions, R 【发布时间】:2019-09-26 07:00:09 【问题描述】:

我有一个数据框 (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. 【参考方案1】:

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

【讨论】:

如果我比较从标准化的标准形式得到的结果,即 normalize 【参考方案2】:
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

【讨论】:

谢谢,但您的代码为数据框的第一列生成 1,这是不正确的 是的,这是我的愚蠢错误。修复了上面的代码。 标准化意味着将我们的数据缩放到 0 到 1 的范围内。查看您的结果后,我看到了负值以及大于 1 的值。 这不是我理解的标准化的意思。那么上面给出的其他解决方案有什么问题呢? 亲爱的@iod,我猜你忘记测试你的脚本了。

以上是关于归一化具有多个条件的数据帧,R的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sklearn 对具有多个特征的时间序列数据进行归一化?

R语言 热图-组学分组数据+归一化

R中的归一化函数

转录组数据定量归一化

如何用matlab对以下函数进行归一化处理

TensorFlow实现条件批归一化(Conditional Batch Normalization)