0
論理条件に基づいて因子ベクトルの要素を要素(要素としてさまざまな因子レベルと欠損値を含む)を変更するための便利で普遍的な方法があります(forベクトルのサブセット、欠損値を因子レベルに変更する)論理条件に基づいた因子ベクトルの要素の変更R
係数ベクトル(fact
)とここで生産論理ベクトル(sel
)を考える:
fact0 <- c("no","no","maybe",NA,"yes","yes","no","no",NA,NA,"maybe")
fact <- factor(fact0)
sel <- c(FALSE,TRUE,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,TRUE)
所望の出力:
[1] no no maybe no yes yes no no no <NA> maybe
Levels: maybe no yes
私の最初のアイデアはifelse()
を使用していたが、それを次のように因子ベクトルを「文字」または「数値」に変換するようです:
ifelse(is.na(fact) & sel, "no", fact)
ifelse(is.na(fact) & sel, 2, fact)
related questionはlevels()
に基づいて、興味深い答えを与えたが、そのソリューションは、論理条件の一部として、欠損値に対処することができませんでした:
levels(fact)[which(is.na(fact) & sel)] #Output is "[1] NA NA"
levels(fact)[which(is.na(fact) & sel)] <- "no"
levels(fact)[which(is.na(fact) & sel)] #Still "[1] NA NA"
醜い溶液」に係数ベクトルを変更することであろう文字」、その上ifelse()
を行うには、次のように、要因に戻って変換します。
char <- as.character(fact)
char2 <- ifelse(is.na(char) & sel, "no", char)
fact2 <- factor(char2)
fact2 #This is the desired output
は、この変換トリックなしでよりエレガントな方法はありますか?
TRUEです「ノー」と値オプションです。私はあなたが'factor() 'でそれを囲むなら、それは1ライナーになるだろうと思う。関連する要素を「文字」に変換せずに変更することは可能ですか? – CarlAH
ああ、私は心配は単なるb/wの文字と要素の変換の間に追加のステップ(s)であることがわかります。 as.factorでオリジナルのソリューションをラップすることも、このトリックを行います。as.factor(ifelse(is.na(fact0)&sel、 "no"、char)) –
ええ、努力してくれてありがとうございます。誰も良い答えが出てこない場合は、しばらくしてから回答を受け入れます。ただし、囲み係数()で編集してください。 – CarlAH