データフレームの因子列のレベルを置き換える必要があります。データセットを例として使用すると、[種]列iris
に含まれるセルをどのように置き換えることができますか?virginica
setosa
以下が機能することを期待していましたが、警告メッセージが生成され、NAが挿入されるだけです。
iris$Species[iris$Species == 'virginica'] <- 'setosa'
データフレームの因子列のレベルを置き換える必要があります。データセットを例として使用すると、[種]列iris
に含まれるセルをどのように置き換えることができますか?virginica
setosa
以下が機能することを期待していましたが、警告メッセージが生成され、NAが挿入されるだけです。
iris$Species[iris$Species == 'virginica'] <- 'setosa'
問題は、値を新しい値に置き換えようとしているときです。これは、現在、既存の要素のレベルの一部ではありません。
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'
「種A」を「種B」に置き換えたい場合は、
levels(iris$Species)[match("oldspecies",levels(iris$Species))] <- "newspecies"
あなたが提案していることについては、:を使用してレベルを変更することができますlevels
:
levels(iris$Species)[3] <- 'new'
revalue
パッケージの関数を使用してplyr
、因子ベクトルの値を置き換えることができます。
virginica
あなたの例では、因子をsetosa
次のように置き換えます。
data(iris)
library(plyr)
revalue(iris$Species, c("virginica" = "setosa")) -> iris$Species
私も同じ問題を抱えていました。これはうまくいきました:
変更するレベルを特定します。levels(iris$Species)
"setosa" "versicolor" "virginica"
だから、setosa
最初です。
次に、これを書きます:
levels(iris$Species)[1] <-"new name"
すべてのデータフレームを一度に処理し、新しい因子レベルを追加する必要がない、より一般的なソリューションは次のとおりです。
data.mtx <- as.matrix(data.df)
data.mtx[which(data.mtx == "old.value.to.replace")] <- "new.value"
data.df <- as.data.frame(data.mtx)
このコードの優れた機能は、元のデータフレームにある値を、1つだけでなく一度に割り当てることができ"new.value"
、新しい値をランダムな値にすることができることです。したがって、元のデータと同じサイズの完全に新しいランダムデータフレームを作成できます。
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
データセット列の値を置き換えたいのですが、次のようなエラーが発生します。
無効な因子レベル、NAが生成されました
代わりにこれを試してください:
levels(dataframe$column)[levels(dataframe$column)=='old_value'] <- 'new_value'
複数の値を置き換える必要があり、変数を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))