2016-11-18 3 views
1

При использовании пакета QCA мы обычно используем ifelse для замены столбцов набора данных с помощью дихотомизированных значений. Но я считаю уродливым использовать вложенные ifelse с при работе с нечеткими множествами.Заявление о замене ifelse при работе с векторами

Есть ли способ использовать оператор case? 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 

ответ

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
#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 
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 более мощный в целом.

Смежные вопросы