0

我需要在我的数据集中生成一些新的因子变量,其中包含来自现有因子变量的信息。

在第一种情况下,我需要根据某些值是否出现在具有 100 多个级别的特定变量中来生成二进制 NewVariable。我使用 plyr 包中的 revalue() 即,

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=="a" 中的一个 = 时,也会发生同样的情况

是否可以使用其级别和标签创建一个因子 NewVariable 而无需预先用字符串值填充它们?我无法找到关于它的东西,我看到的教程已经生成了他们的数据,他们只需要标记现有值。

另外,我想为属于 OptionA、OptionB、OptionC 等的其他案例赋值,是否可以为每个案例设置不同的 if 语句,如下所示?

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

=== 编辑 ===

对于第二个“挑战”,我按照 DWin 建议的代码生成了我在上面 if(...) 中的三个变量的交互,并在 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 

有没有其他方法可以在不使用旧因子变量之间的交互作用的情况下解决这个问题?

4

1 回答 1

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"
于 2013-05-29T22:44:07.177 回答