Переименовать уровни факторов на основе условия в R - PullRequest
0 голосов
/ 16 марта 2019

Допустим, у нас есть следующий фрейм данных:

data1 <- data.frame(S1 = sample(c("A", "B", "C"), size = 20, replace = TRUE),
                    S2 = sample(c("A", "B", "C"), size = 20, replace = TRUE),
                    number = rnorm(20, 10, 100))

Также есть эта переменная:

scenario <- "scenario1" # can take one of thre values: 'scenario1', 'scenario2', 'scenario3'

Есть также следующие сопоставления. Обратите внимание, что имена уровней в разных сценариях не могут обрабатываться автоматически, например, с регулярным выражением:

changer_1 <- c("A"="a1", "B"="b1", "C"="c1")
changer_2 <- c("A"="something", "B"="completely", "c"="different")
changer_3 <- c("A"="z2", "B"="d3", "c"="p14")

Я хочу переименовать уровни факторов на основе значения (условия) scenario. До сих пор я придумал довольно примитивный блок if/else, который проверяет условие и затем использует один из changer s:

if(scenario=="scenario1"){
  data1$S1 <- revalue(data1$S1, changer_1)
  data1$S2 <- revalue(data1$S2, changer_1)
} else if (scenario=='scenario2'){
  data1$S1 <- revalue(data1$S1, changer_2)
  data1$S2 <- revalue(data1$S2, changer_2)
} else {
  data1$S1 <- revalue(data1$S1, changer_3)
  data1$S2 <- revalue(data1$S2, changer_3)
}

Интересно, есть ли другой (более R-подобный) способ сделать это?

1 Ответ

1 голос
/ 16 марта 2019

Один из способов сделать это - создать список со всеми «сценариями» и их отображениями

change_list <- list(scenario1 =  c("A"="a1", "B"="b1", "C"="c1"), 
             scenario2 = c("A"="something", "B"="completely", "C"="different"), 
             scenario3 = c("A"="z2", "B"="d3", "C"="p14"))

Теперь создайте функцию, которая возвращает значения согласно сценарию

get_values <- function(change_list, scenario, x) {
   change_list[[scenario]][x]
}

и теперь вы можете вызывать функцию

get_values(change_list, "scenario1", data1$S1)

#  A    C    B    B    B    C    B    B    C    A    A    C    C    A    B  ...  
#"a1" "c1" "b1" "b1" "b1" "c1" "b1" "b1" "c1" "a1" "a1" "c1" "c1" "a1" "b1" ...

get_values(change_list, "scenario2", data1$S1)

#          A            C            B            B            B            C ..   
#  "something"  "different" "completely" "completely" "completely"  "different"..

Таким образом, с помощью только одной функции вы можете изменить все значения в любом столбце.

...