我需要替换数据帧中因子列的级别.使用iris数据集作为一个例子,我将如何取代它含有任何细胞virginica与setosa在物种列?
我期望以下工作,但它会生成一条警告消息,只需插入NAs:
iris$Species[iris$Species == 'virginica'] <- 'setosa'
Run Code Online (Sandbox Code Playgroud)
flo*_*del 84
我敢打赌问题是当你试图用新的值替换值时,这个值当前不是现有因子的一部分:
levels(iris$Species)
# [1] "setosa" "versicolor" "virginica"
Run Code Online (Sandbox Code Playgroud)
你的例子不好,这有效:
iris$Species[iris$Species == 'virginica'] <- 'setosa'
Run Code Online (Sandbox Code Playgroud)
这更有可能产生您使用自己的数据看到的问题:
iris$Species[iris$Species == 'virginica'] <- 'new.species'
# Warning message:
# In `[<-.factor`(`*tmp*`, iris$Species == "virginica", value = c(1L, :
# invalid factor level, NAs generated
Run Code Online (Sandbox Code Playgroud)
如果您首先提高因子水平,它将起作用:
levels(iris$Species) <- c(levels(iris$Species), "new.species")
iris$Species[iris$Species == 'virginica'] <- 'new.species'
Run Code Online (Sandbox Code Playgroud)
Gre*_*now 10
对于您建议的内容,您可以使用以下方法更改级别levels:
levels(iris$Species)[3] <- 'new'
Run Code Online (Sandbox Code Playgroud)
neb*_*ebi 10
您可以使用revalue包中的函数plyr替换因子向量中的值.
在您的示例中,virginica通过setosa以下方式替换因子:
data(iris)
library(plyr)
revalue(iris$Species, c("virginica" = "setosa")) -> iris$Species
Run Code Online (Sandbox Code Playgroud)
使用dlpyr::mutate和forcats::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
Run Code Online (Sandbox Code Playgroud)
小智 5
我有同样的问题。这效果更好:
确定要修改的级别: levels(iris$Species)
"setosa" "versicolor" "virginica"
Run Code Online (Sandbox Code Playgroud)
所以,setosa是第一。
然后,写这个:
levels(iris$Species)[1] <-"new name"
Run Code Online (Sandbox Code Playgroud)