问题似乎太简单了,甚至不能放在这里;但我找不到有效的解决方案。我有一个3列的数据框(df
);其中一个是具有3个级别(“蓝色”,“红色”和“黑色”)的因子列(df$Colors
)。在另一列(df$Outliers
)中是数值,其中一些是“NA”。我想添加另一列(比如df$NewColors
),类似于df$Colors
,df$Outliers
,df$NewColors = "Orange"
中的“NA”。
我添加了一个额外的级别如下:
> levels(df$Colors) <- c(levels(df$Colors), "Orange")
然而,新添加的列似乎是使用旧的“颜色”值,而不是将其替换为“橙色”,它应该在那里。它还为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)
答案 0 :(得分:0)
正如@ joel.wilson所提到的,你的数据示例是不正确的,因为它给出了角色&#34; NA&#34;而不是缺失值(NA)。如果导致问题,您可以使用以下方法进行调整:
df$Outliers[which(df$Outliers=="NA")]<-NA
除此之外,这样的事情应该适用于你想要实现的目标:
df$new.colors<-ifelse(is.na(df$Outliers),"Orange",as.character(df$Colors))
返回&#34; Orange&#34;如果df $ Outliers是NA,否则返回df $ Colors。
使用as.factor
再次将此新变量设为一个因子。
答案 1 :(得分: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不是真正的NA,而是表示NA的文本。要做到这一点,样本数据必须是:
Outliers <- c(seq(1,8),NA,seq(1,8),NA)
然后你可以使用:
df$Colors_new[is.na(df$Outliers)] <- "Orange"
答案 2 :(得分:0)
正如评论NA
中所述,"NA"
不是"NA"
。如果您有is.na("NA")
,则将您的异常值视为字符数据,因为数值是强制的。另外NA
返回FALSE。如果您的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
,则df$Outliers == "NA"
应替换为Miqi180