49

データフレームの因子列のレベルを置き換える必要があります。データセットを例として使用すると、[]列irisに含まれるセルをどのように置き換えることができますか?virginicasetosa

以下が機能することを期待していましたが、警告メッセージが生成され、NAが挿入されるだけです。

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

8 に答える 8

102

問題は、値を新しい値に置き換えようとしているときです。これは、現在、既存の要素のレベルの一部ではありません。

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"
于 2012-08-04T17:51:03.063 に答える
20

あなたが提案していることについては、:を使用してレベルを変更することができますlevels

levels(iris$Species)[3] <- 'new'
于 2012-08-04T22:10:47.243 に答える
11

revalueパッケージの関数を使用してplyr、因子ベクトルの値を置き換えることができます。

virginicaあなたの例では、因子をsetosa次のように置き換えます。

 data(iris)
 library(plyr)
 revalue(iris$Species, c("virginica" = "setosa")) -> iris$Species
于 2014-01-28T19:29:04.353 に答える
5

私も同じ問題を抱えていました。これはうまくいきました:

変更するレベルを特定します。levels(iris$Species)

    "setosa" "versicolor" "virginica" 

だから、setosa最初です。

次に、これを書きます:

     levels(iris$Species)[1] <-"new name"
于 2017-03-23T13:13:54.413 に答える
2

すべてのデータフレームを一度に処理し、新しい因子レベルを追加する必要がない、より一般的なソリューションは次のとおりです。

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"、新しい値をランダムな値にすることができることです。したがって、元のデータと同じサイズの完全に新しいランダムデータフレームを作成できます。

于 2018-01-12T15:32:09.430 に答える
2

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   
于 2018-03-09T14:00:05.403 に答える
1

データセット列の値を置き換えたいのですが、次のようなエラーが発生します。

無効な因子レベル、NAが生成されました

代わりにこれを試してください:

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

于 2019-01-29T23:04:50.557 に答える
0

複数の値を置き換える必要があり、変数を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))
于 2018-03-20T14:15:39.020 に答える