对于一列中的NA;不能改变另一列的因子水平
问题描述:
这个问题似乎太简单了,甚至不能放在这里;但我找不到可行的解决方案。我有一个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)
答
这工作:
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"
答
正如@ 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
再次使这个新变量成为一个因素。
答
正如评论指出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
应与
替换为“NA”是NA不同。 –