替换R数据帧中因子列的内容

luc*_*ano 40 r

我需要替换数据帧中因子列的级别.使用iris数据集作为一个例子,我将如何取代它含有任何细胞virginicasetosa物种列?

我期望以下工作,但它会生成一条警告消息,只需插入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)

  • 但是如果你想用物种B取代物种A你最好用'水平(虹膜$物种)[匹配("oldspecies",水平(虹膜$物种))] < - "newspecies" (14认同)
  • +1很好的答案.你从哪里得到了你的阅读机器?:-) (2认同)

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)


sbh*_*bha 7

使用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   
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)