2013-05-29 92 views
0

我需要在我的數據集中產生一些包含來自現有因子變量信息的新因子變量。使用if語句從其他因子變量的水平創建因子變量

在第一種情況下,我需要基於特定變量是否出現在具有超過100個級別的特定變量中來生成二元NewVariable。 我使用重估()從plyr包 也就是說,

NewVar <- if(OldVar1=="helen" | OldVar1=="greg") 
      {NewVar <-revalue(OldVar1, c("helen"="participant", "greg"="participant"))} 
      else {NewVar=="nonparticipant"} 

其實我是想具體水平摺疊成由新的變量特定水平。正如你可以想象的上述代碼不起作用,但我不明白爲什麼。

在我需要的信息從現有的三個因素變量(OldVar1,OldVar2,OldVar3),以填補在多類別NewVariable的,我運行這段代碼的級別相結合的第二種情況,

NewVariable="OptionA" <- if(OldVar1=="a" & OldVar2=="b" & OldVar3=="c") 

我得到一個錯誤「錯誤:意外‘=’在‘OldVar =’ 同樣發生在我刪除的OldVar1的=的==一個」一」

是否有可能創建一個因素NewVariable其水平和標籤沒有提前填寫字符串值?我無法找到的東西,我看到有教程管理他們的數據,他們只需要標記現有的值。

此外,我想給屬於OptionA,OptionB,OptionC等的其他案例賦予值,這樣可以爲它們中的每一個設置不同的if語句,如下所示:

NewVariable="OptionA" <- if(OldVar1=="a" & OldVar2=="b" & OldVar3=="c") 
NewVariable="OptionB" <- if(OldVar1=="a" & OldVar2=="d" & OldVar3=="e") 

===編輯===

對於第二個「挑戰」我接着迪文 建議的代碼,我生產我的三個變量,我在的,如果(的作用... )以上,並設置內部C()只是我需要,例如

OldVar.ALL.interactions <- with(data, interaction(OldVar1, OldVar2, OldVar3) 
levels(OldVar.ALL.interactions) # search for the levels that we need to include 
# in the NewVar 
# below I follow DWin's code 
NewVar <- factor(rep(NA, length(AnotherVarOfTheDataset)), 
        levels=c("OptionA", "OptionB", ...)) 
NewVar[OldVar.ALL.interactions %in% c("...interaction.of.Old.Variables...")] <- "OptionA" 
# the same as in OptionA for the rest of the levels 
# the ** NewVar[ is.na(NewVar) ] <- "nonparticipant" ** of DWin's code is not needed 

是否有任何其他的方式來解決這個問題,而無需使用舊的因子變量之間的相互作用的價值?

+0

您不能通過操作levels屬性輕鬆摺疊關卡。我開始做一些像'levels(NewVar)< - gsub(「greg | helen」...)的東西,並意識到這會失敗。如果你想做一個任務,你也不能使用:'else {NewVar ==「nonparticipant」}'。然後是「if」和「else」沒有向量化的問題。 –

+0

看來'plyr :: revalue'會讓你摺疊關卡,所以它可能是錯誤地使用'if'和'else'而不是'ifelse',這是你絆倒你的一部分。 'revalue'也沒有「all.others」=「other_level」參數。 –

+0

「無矢量化」意味着它們不會運行數據集的所有矢量長度?這就是爲什麼諾亞的建議包含一個參數length.out = 10? – Pulse

回答

2

我可能會先有自己的空因子變量(假設你想有一個因素是由主題行暗示):

NewVar <- factor(rep(NA, length(OldVar)), 
       levels=c("participant", "nonparticipant")) 
NewVar[ OldVar %in% c("a", "b", "c")] <- "participant" 
NewVar[ is.na(NewVar) ]    <- "nonparticipant" 

如果你不介意有一個特徵向量比這些行更接近:

y <- vector("character",length(x)) 
y[ x %in% c("a","c")] <- "p" 
y[ !x %in% c("a","c")] <- "np" 
y 
#[1] "p" "np" "p" 
+0

它的工作!只有我不得不將level更改爲levels = c(「」,「」),或者從第一行開始(< - 「參與者」)給我的級別(NewVar)僅給予第二級別和許多NA。「警告消息:...無效因子水平,NA產生「 – Pulse

+0

假設你的意思是水平= c(」參與者「,」非參與者「),那就是正確的; @迪文在那裏有一個小錯誤,我相信他一看到這些消息就會修復。如果你能提供一個可重複使用的小例子(比如諾阿爲你製作的),你會得到更好的答案;這將允許其他人測試可能的解決方案。 – Aaron