2012-08-04 63 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