归一化具有多个条件的数据帧,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的主要内容,如果未能解决你的问题,请参考以下文章