我需要在我的数据集中生成一些新的因子变量,其中包含来自现有因子变量的信息。
在第一种情况下,我需要根据某个值是否出现在具有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
在不使用旧因子变量之间的相互作用的情况下,还有其他方法可以解决这个问题吗?
答案 0 :(得分: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"