2016-05-18 7 views
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 questionlevels()に基づいて、興味深い答えを与えたが、そのソリューションは、論理条件の一部として、欠損値に対処することができませんでした:

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 

は、この変換トリックなしでよりエレガントな方法はありますか?

答えて

0

はここしかし、単に「fact0」ベクトルを反復処理と置き換える任意のNAは「SEL」内の同じインデックスが文字ベクトルを生成

sapply(seq_along(fact0), function(i) as.factor(ifelse(sel[i] & is.na(fact0[i]), "no", fact0[i]))) 
[1] no no maybe no yes yes no no no <NA> maybe 
Levels: no maybe yes 
+0

TRUEです「ノー」と値オプションです。私はあなたが'factor() 'でそれを囲むなら、それは1ライナーになるだろうと思う。関連する要素を「文字」に変換せずに変更することは可能ですか? – CarlAH

+0

ああ、私は心配は単なるb/wの文字と要素の変換の間に追加のステップ(s)であることがわかります。 as.factorでオリジナルのソリューションをラップすることも、このトリックを行います。as.factor(ifelse(is.na(fact0)&sel、 "no"、char)) –

+0

ええ、努力してくれてありがとうございます。誰も良い答えが出てこない場合は、しばらくしてから回答を受け入れます。ただし、囲み係数()で編集してください。 – CarlAH

関連する問題