我需要替换数据框中因子列的水平。以iris数据集为例,如何将 Species 列中包含virginica的单元格替换为setosa?我希望下面的代码能够工作,但是它生成了一条警告消息,并且只是插入了NAs:
iris
virginica
setosa
iris$Species[iris$Species == 'virginica'] <- 'setosa'
xxslljrj1#
我敢打赌,当你试图用一个新的值来替换现有因子水平之外的值时,问题就出现了:
levels(iris$Species) # [1] "setosa" "versicolor" "virginica"
你的例子很糟糕,但这很有效:
这更有可能造成您在自己的数据中看到的问题:
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'
如果你想用“物种B”代替“物种A”,你最好用
levels(iris$Species)[match("oldspecies",levels(iris$Species))] <- "newspecies"
gzszwxb42#
对于您建议的内容,您可以使用levels更改级别:
levels
levels(iris$Species)[3] <- 'new'
yzuktlbb3#
您可以使用plyr包中的revalue函数替换因子向量中的值。在示例中,将因子virginica替换为setosa:
plyr
revalue
data(iris) library(plyr) revalue(iris$Species, c("virginica" = "setosa")) -> iris$Species
b1payxdu4#
我也遇到过同样的问题。这样效果更好:确定要修改的级别:levels(iris$Species)
levels(iris$Species)
"setosa" "versicolor" "virginica"
因此,setosa是第一个。然后,写这个:
levels(iris$Species)[1] <-"new name"
vbopmzt15#
使用dlpyr::mutate和forcats::fct_recode:
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
osh3o9ms6#
一种更通用的解决方案可同时处理所有数据框,且无需添加新的因子水平,该解决方案为:
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",而且新值可以是随机值,这样你就可以创建一个与原始数据框大小相同的完整的新随机数据框。
"new.value"
sr4lhrrt7#
您希望替换数据集列中的值,但却收到如下错误:因子水平无效,生成NA试试这个:levels(dataframe$column)[levels(dataframe$column)=='old_value'] <- 'new_value'
levels(dataframe$column)[levels(dataframe$column)=='old_value'] <- 'new_value'
km0tfn4u8#
如果你必须替换多个值,并且你不介意用as.factor(as.character(...))“重构”你的变量,你可以尝试以下方法:
replace.values <- function(search, replace, x){ stopifnot(length(search) == length(replace)) xnew <- replace[ match(x, search) ] takeOld <- is.na(xnew) & !is.na(x) xnew[takeOld] <- x[takeOld] return(xnew) } iris$Species <- as.factor(search=c("oldValue1","oldValue2"), replace=c("newValue1","newValue2"), x=as.character(iris$Species))
qyzbxkaa9#
水平(虹膜$物种)含量(虹膜$种)[3]〈- '刚毛'
9条答案
按热度按时间xxslljrj1#
我敢打赌,当你试图用一个新的值来替换现有因子水平之外的值时,问题就出现了:
你的例子很糟糕,但这很有效:
这更有可能造成您在自己的数据中看到的问题:
如果您首先提高因子水平,它将起作用:
如果你想用“物种B”代替“物种A”,你最好用
gzszwxb42#
对于您建议的内容,您可以使用
levels
更改级别:yzuktlbb3#
您可以使用
plyr
包中的revalue
函数替换因子向量中的值。在示例中,将因子
virginica
替换为setosa
:b1payxdu4#
我也遇到过同样的问题。这样效果更好:
确定要修改的级别:
levels(iris$Species)
因此,
setosa
是第一个。然后,写这个:
vbopmzt15#
使用
dlpyr::mutate
和forcats::fct_recode
:osh3o9ms6#
一种更通用的解决方案可同时处理所有数据框,且无需添加新的因子水平,该解决方案为:
这段代码的一个很好的特性是,你可以一次为原始数据框赋值,而不是一个
"new.value"
,而且新值可以是随机值,这样你就可以创建一个与原始数据框大小相同的完整的新随机数据框。sr4lhrrt7#
您希望替换数据集列中的值,但却收到如下错误:
因子水平无效,生成NA
试试这个:
levels(dataframe$column)[levels(dataframe$column)=='old_value'] <- 'new_value'
km0tfn4u8#
如果你必须替换多个值,并且你不介意用as.factor(as.character(...))“重构”你的变量,你可以尝试以下方法:
qyzbxkaa9#
水平(虹膜$物种)
含量(虹膜$种)[3]〈- '刚毛'