【发布时间】:2013-05-29 22:05:59
【问题描述】:
我需要在我的数据集中生成一些新的因子变量,其中包含来自现有因子变量的信息。
在第一种情况下,我需要根据某些值是否出现在具有 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
有没有其他方法可以在不使用旧因子变量之间的交互作用的情况下解决这个问题?
【问题讨论】:
-
您不能再通过操作levels 属性轻松折叠关卡了。我开始做类似
levels(NewVar) <- gsub("greg|helen" ...)的事情,并意识到那会失败。如果你想做一个作业,你也不能使用:else {NewVar=="nonparticipant"}。然后是if和else没有向量化的整个问题。 -
看来
plyr::revalue会让你折叠关卡,所以可能是错误使用if和else而不是ifelse,这是让你绊倒的部分原因.revalue也没有 "all.others" = "other_level" 参数。 -
“未矢量化”是指它们不会运行数据集矢量的所有长度?这就是为什么 noah 的建议包含参数 length.out=10 的原因吗?
-
对。
if和else采用长度正好为 1 的参数。它们是程序控制函数,当他们是 SAS 或 SPSS 的先前用户(其中数据步骤都具有隐式列操作)时,它们不会像人们期望的那样运行。 -
您对“未矢量化”的解释是正确的,但这与
length.out无关;这只是设置长度为 10 的示例数据集(因为您没有提供)。
标签: r variables loops if-statement r-factor