在处理向量时替换ifelse的case语句

时间:2016-11-18 12:15:49

标签: r if-statement switch-statement

在使用QCA包时,我们通常使用ifelse来替换具有二分值的数据集列。但是我发现在处理模糊集时必须使用嵌套的ifelse是很难看的。

有没有办法使用案例陈述? switch仅用于控制流程,不处理向量。

例如:

DDDfz $VIES <- ifelse (DDD $vies == "p", 1, 0)

没问题,但是

DDDfz $TIPO <- switch (DDD $tipo, "PD", 0, "PL", 0.5, "MP", 1)
    Error in switch(DDD$tipo, "PD", 0, "PL", 0.5, "MP", 1) : 
    EXPR deve ser um vetor de comprimento 1

3 个答案:

答案 0 :(得分:4)

switch未进行矢量化,无法在此处使用。 R为这样的任务提供factor数据类。

factor(c(0, 0.5, 1), levels = c(0, 0.5, 1), 
                     labels = c("PD", "PL", "MP"))
#[1] PD PL MP
#Levels: PD PL MP

在第一个示例中,您也不需要ifelse。您只需执行as.integer(DDD$vies == "p")

PS:$前面的空格是一种奇怪的代码风格。

答案 1 :(得分:1)

#data example
TIPO = c("PD", "PL",  "MP", "PL",  "MP")

# here we create dictionary 
dict = c("PD" = 0, "PL" = 0.5, "MP" = 1)
# further we match dictionary with original values 
recoded_TIPO = dict[TIPO]

# result
recoded_TIPO

答案 2 :(得分:0)

遗憾的是,R switch函数的用处非常有限。 The ‹dplyr› package has a nice pattern matching function更强大:

result = case_when(
    x == 'PD' ~ 0,
    x == 'PL' ~ 0.5,
    x == 'MP' ~ 1
)

在这种特殊情况下,其他解决方案(使用因子或向量)更简洁,也更有效。但case_when一般来说更强大。