2017-01-16 2 views
5

Предположим, что у меня есть набор данных с категорическим переменной X, которая принимает значения A, B или C.Создание новой переменной На основе категориальной переменной Уже в Dataset

Я хочу создать новую переменную Y что

  • 1, если X = A;
  • 2, если X = B;
  • 3, если X = C.

Вот что у меня есть до сих пор, и я знаю, что это неправильно.

if(X==A) { 
    (Y = 1) 
    } 
else if(X==B) { 
    (Y = 2) 
    } 
else { 
    (Y = 3) 
    } 

Я получаю сообщение об ошибке:

Object 'Y' not found

Как создать переменную Y таким образом, что он может взять на себя эти новые ценности, основанные на значениях X?

ответ

4

Голосов на вопрос сильно озадачить меня ... так что ответ нужен для этого вопроса?

С методом петли на основе, как и предполагались ОП, является:

Y <- numeric(length(X)) ## initialize a numeric vector `Y`, of the same length of `X` 
## loop through all elements of `X`, use `if-else` to allocate value for `Y` 
for (i in seq_along(X)) { 
    if (X[i] == "A") Y[i] <- 1 
    else if (X[i] == "B") Y[i] <- 2 
    else if (X[i] == "C") Y[i] <- 3 
    } 

Полностью Векторизованным метод является

Y <- match(X, LETTERS[1:3]) 

Здесь LETTERS внутренние константы R для заглавных букв. В R есть несколько констант, и вы можете получить их все, прочитав документацию ?Constants.

2

В этом случае вы можете рассмотреть dplyr::recode в tidyverse. Это, по сути, векторизованный switch, который, кажется, то, что вы хотите. В качестве альтернативы вы можете использовать второй тип данных и использовать dplyr::left_join или base::merge.

library(tidyverse) 

data = tribble(
    ~x, ~y, 
    1, "A", 
    2, "A", 
    4, "B", 
    5, "C", 
    7, "Z" 
) 

data %>% 
    mutate(
     new_var = recode(y, "A" = "first", 
          "B" = "second", 
          "C" = "third", 
          "Z" = "last") 
    ) 
#> # A tibble: 5 X 3 
#>  x  y new_var 
#> <dbl> <chr> <chr> 
#> 1  1  A first 
#> 2  2  A first 
#> 3  4  B second 
#> 4  5  C third 
#> 5  7  Z last 
5

Вариант 1: принять числовые значения коэффициента.

X 
# [1] "B" "C" "A" "C" "A" "C" "B" "B" "A" "A" 
c(factor(X)) 
# [1] 2 3 1 3 1 3 2 2 1 1 

c() капель атрибутов, и используется для общей крутости. as.numeric() может быть более читаемым.

Вариант 2: Вектор поиска.

c(A = 1, B = 2, C = 3)[X] 
# B C A C A C B B A A 
# 2 3 1 3 1 3 2 2 1 1 

данных:

set.seed(25) 
X <- sample(LETTERS[1:3], 10, TRUE)