2017-01-16 16 views
5

Giả sử tôi có tập dữ liệu với biến phân loại X có giá trị A, B hoặc C.Tạo biến mới dựa trên biến số phân loại Đã có trong Tập dữ liệu

Tôi muốn tạo ra một biến mới Y đó là

  • 1, nếu X = A;
  • 2, nếu X = B;
  • 3, nếu X = C.

Đây là những gì tôi có cho đến thời điểm này và tôi biết rằng nó không chính xác.

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

tôi tiếp tục nhận được lỗi:

Object 'Y' not found

Làm thế nào để tạo ra các biến Y như vậy mà nó có thể đảm nhận những giá trị mới dựa trên các giá trị của X?

Trả lời

4

Các phiếu bầu cho câu hỏi này khiến tôi rất khó hiểu ... vì vậy câu trả lời là mong muốn cho câu hỏi này?

Với phương pháp lặp dựa trên, như OP dự định, là:

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 
    } 

Phương pháp hoàn toàn vectorized, là

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

Ở đây, LETTERS là hằng số R nội bộ cho chữ in hoa. Có vài hằng số trong R, và bạn có thể nhận được tất cả bằng cách đọc tài liệu ?Constants.

2

Trong trường hợp này, bạn có thể muốn xem xét dplyr::recode trong tidyverse. Về cơ bản nó là một vectorized switch mà dường như là những gì bạn muốn. Ngoài ra, bạn có thể sử dụng dữ liệu thứ hai và sử dụng số dplyr::left_join hoặc 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

Tùy chọn 1: Lấy giá trị số của yếu tố.

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() giảm thuộc tính và được sử dụng để tạo ra sự hài hước chung. as.numeric() có thể dễ đọc hơn.

Tùy chọn 2: Một vector tra cứu.

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 

dữ liệu:

set.seed(25) 
X <- sample(LETTERS[1:3], 10, TRUE) 
Các vấn đề liên quan