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

时间:2012-08-04 17:30:39

标签: r

我需要替换数据帧中因子列的级别。以iris数据集为例,如何在 Species 列中替换包含virginica setosa的所有单元格?

我希望以下方法有效,但它会生成一条警告消息,只需插入NAs:

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

8 个答案:

答案 0 :(得分:82)

我打赌问题是当你试图用新的值替换值时,这个值当前不是现有因子的一部分:

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'

答案 1 :(得分:10)

对于您建议的内容,您只需使用levels更改级别:

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

答案 2 :(得分:10)

您可以使用包revalue中的plyr函数替换因子向量中的值。

在您的示例中,用virginica替换因子setosa

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

答案 3 :(得分:4)

我遇到了同样的问题。这效果更好:

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

    "setosa" "versicolor" "virginica" 

所以,setosa是第一个。

然后,写下这个:

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

答案 4 :(得分: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",新值可以是随机值。因此,您可以创建一个与原始大小相同的完整的新随机数据框。

答案 5 :(得分: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   

答案 6 :(得分:0)

如果您必须更换多个值,并且您不介意&#34;重构&#34;你的变量与as.factor(as.character(...))你可以尝试以下:

meteor v0.0.2 [Approved]

meteor package files install completed. Performing other installation steps.

Downloading meteor 64 bit
  from 'https://packages.meteor.com/bootstrap-link?arch=os.windows.x86_64'

Progress: 4% - Saving 8.12 MB of 171.74 MB

Download of meteor-bootstrap-os.windows.x86_64.tar.gz (171.74 MB) completed.

ERROR: Chocolatey expected a file at 'C:\Users\HP\AppData\Local\Temp\chocolatey\
meteor\0.0.2\meteor-bootstrap-os.windows.x86_64.tar.gz' to be of length '180086547' but the length was '8552029'.

The install of meteor was NOT successful.

Error while running 'C:\ProgramData\chocolatey\lib\meteor\tools\chocolateyinstall.ps1'.
 See log for details.

Chocolatey installed 0/1 packages. 1 packages failed.
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).

Failures
 - meteor (exited -1) - Error while running 'C:\ProgramData\chocolatey\lib\meteo r\tools\chocolateyinstall.ps1'.
 See log for details.

答案 7 :(得分:0)

您要替换数据集列中的值,但是会出现如下错误:

  

无效的因子水平,NA生成

尝试以下方法:

levels(dataframe$column)[levels(dataframe$column)=='old_value'] <- 'new_value'