2012-08-04 64 views
32

我需要替换数据框中因子列的级别。以iris数据集为例,我将如何替换中的任何单元格和列中的setosa替换R数据框中的因子列的内容

我希望下面的工作,但它会产生一个警告信息,并简单地插入来港:

iris$Species[iris$Species == 'virginica'] <- 'setosa' 
+0

您与例如'iris'只是工作。你能以其他方式复制你的问题吗?目前很难理解你想要做什么。 – Andrie 2012-08-04 17:34:13

+0

适合我。你得到了哪个警告信息? – sgibb 2012-08-04 17:34:28

+1

再次尝试时,它与虹膜一起工作。然而,将其应用于我的数据集给出了这个:警告消息:在[[<。。factor>('* tmp *',x $ Hweet ==“hweet”,value = c(NA_integer_,: 无效因子水平,生成 – luciano 2012-08-04 17:42:56

回答

68

我敢打赌,问题是当你试图用一个新的,一个是不是要取代值目前现有的因子的水平的一部分:

levels(iris$Species) 
# [1] "setosa"  "versicolor" "virginica" 

你举的例子是坏的,这个工程:

iris$Species[iris$Species == 'virginica'] <- 'setosa' 

这是更容易创建你自己的数据被看到的问题:

iris$Species[iris$Species == 'virginica'] <- 'new.species' 
# Warning message: 
# In `[<-.factor`(`*tmp*`, iris$Species == "virginica", value = c(1L, : 
# invalid factor level, NAs generated 

它会工作,如果你第一次增加你的因子水平:

levels(iris$Species) <- c(levels(iris$Species), "new.species") 
iris$Species[iris$Species == 'virginica'] <- 'new.species' 
+10

但是如果你想用物种B代替物种A,你最好使用'levels(iris $物种) [match(“oldspecies”,levels(iris $ Species))] < - “newspecies”' – 2012-08-04 17:55:38

+0

@flodel - 正好 – luciano 2012-08-04 17:57:14

+2

+1好的答案。你从哪里得到你的读心机?:-) – Andrie 2012-08-04 18:11:42

8

对于您所提出的建议的事情你可以只用改变各级levels

levels(iris$Species)[3] <- 'new' 
+0

有没有在多列上做一次性的方法?例如,我有多个'TRU'的列E'和'FALSE'的值,我想重新编码为'0','1' – UD1989 2015-12-08 03:50:31

+1

@ UD1989,只是使用像'mydf [] < - lapply(mydf,as.numeric)' – 2015-12-08 20:03:07

8

您可以使用函数revalue从帕茨卡ge plyr来替换因子向量中的值。

在您的例子由setosa更换因素virginica

data(iris) 
library(plyr) 
revalue(iris$Species, c("virginica" = "setosa")) -> iris$Species 
+0

如果我不'有没有旧的价值? //并不想获取旧值只是为了在这个方法中使用它 – 2014-11-25 11:51:37

2

我有同样的问题。这更好的工作:

确定要修改哪个级别:levels(iris$Species)

"setosa" "versicolor" "virginica" 

所以,setosa是第一个。

然后,写这样的:

 levels(iris$Species)[1] <-"new name" 
1

,与所有的数据帧一次工作,并在那里你不必增加新的因素的水平是一个更通用的解决方案:

data.mtx <- as.matrix(data.df) 
data.mtx[which(data.mtx == "old.value.to.replace")] <- "new.value" 
data.df <- as.data.frame(data.mtx) 

此代码的一个很好的功能是,您可以一次分配原始数据框中的多个值,而不仅仅是一个"new.value",并且新值可以是随机值。因此,您可以创建一个与原始大小相同的完整新随机数据框。

0

使用dlpyr::mutateforcats::fct_recode

library(dplyr) 
library(forcats) 

iris <- iris %>% 
    mutate(Species = fct_recode(Species, 
    "Virginica" = "virginica", 
    "Versicolor" = "versicolor" 
)) 

iris %>% 
    count(Species) 

# A tibble: 3 x 2 
    Species  n 
     <fctr> <int> 
1  setosa 50 
2 Versicolor 50 
3 Virginica 50