2016-12-02 46 views
0

这个问题似乎太简单了,甚至不能放在这里;但我找不到可行的解决方案。我有一个3列的数据框(df);其中一个是具有3个等级(“蓝色”,“红色”和“黑色”)的因子列(df$Colors)。在另一列(df$Outliers)中有一些是“NA”的数字值。我想添加另一列(如df$NewColors),类似于df$Colors,其中“NA”为df$Outliers,df$NewColors = "Orange"。 我加入另外的电平如下所示:对于一列中的NA;不能改变另一列的因子水平

> levels(df$Colors) <- c(levels(df$Colors), "Orange") 

但是新添加的列似乎它should.Also它的因素生成的整数值待使用旧的“颜色”值而不是通过“橙色”替换它的df$Colors但我想保留旧的分类变量。 我使用的代码如下:

>levels(df$Color) <- c(levels(df$Color),"Orange") 

> for (i in 1:nrow(df)) { 
    df$NewColors[i] <- ifelse (is.na(df$Outliers[i]), "Orange", df$Colors[i]) 
    } 

我要去哪里错了?
这里是样本数据:

> BodyLength <- rep(seq(1,9),2) 
> Colors <- rep(c("Black","Blue","Red"),6) 
> Outliers <- c(seq(1,8),"NA",seq(1,8),"NA") 
> df <- data.frame(BodyLength,Colors,Outliers) 
+1

替换为“NA”是NA不同。 –

回答

0

这工作:

df$Colors_new <- df$Colors 
levels(df$Colors_new) <- c(levels(df$Colors_new),"Orange") 
df$Colors_new[which(df$Outliers == "NA")] <- "Orange" 

请注意,你的NA不是实际的NAS但说NA,而文本。要正确地做到这一点样本数据必须是:

Outliers <- c(seq(1,8),NA,seq(1,8),NA) 

那么你可以使用:

df$Colors_new[is.na(df$Outliers)] <- "Orange" 
+0

工程就像一个魅力......让我感觉像个傻瓜!谢谢@JonGrub – Mansi

+0

你不需要。问题是我学会这个的方式:)顺便说一句:如果你喜欢我的回答,你会接受吗? – JonGrub

0

正如@ joel.wilson提到您的数据的例子是,它给人的字符不正确“NA”代替缺失值(NA)。如果这是导致该问题,你可以调整这个使用下列内容:

df$Outliers[which(df$Outliers=="NA")]<-NA 

除此之外,这样的事情应该为你工作要实现的目标是什么:

df$new.colors<-ifelse(is.na(df$Outliers),"Orange",as.character(df$Colors)) 

回报“橙色”如果DF $ Outliers是NA,否则返回df $ Colors。 使用as.factor再次使这个新变量成为一个因素。

0

正如评论指出NA"NA"。如果你有"NA"你的离群值被视为字符数据,因为数值被强制。另外is.na("NA")返回FALSE。如果你的NA被适当处理,你的代码应该没问题。您也可以考虑使用replace作为循环的替代方案。

BodyLength <- rep(seq(1,9),2) 
Colors <- rep(c("Black","Blue","Red"),6) 
Outliers <- c(seq(1,8),NA,seq(1,8),NA) 
df <- data.frame(BodyLength,Colors,Outliers) 
df$newColors = df$Colors 
levels(df$newColors) = c(levels(df$Colors),"Orange") 
df$newColors = replace(df$newColors,is.na(df$Outliers),"Orange") 

如果你打算有异常为特征,以价值"NA",然后is.na应与

相关问题