2017-01-16 3 views
5

Angenommen, ich besitze einen Datensatz mit einer kategorialen Variablen X, der die Werte A, B oder C annimmt.Erstellen einer neuen Variablen basierend auf einer bereits im Datensatz enthaltenen kategorialen Variablen

Ich möchte eine neue Variable Y erstellen, die

  • 1, wenn X = A ist;
  • 2, wenn X = B;
  • 3, wenn X = C.

Hier ist was ich bisher habe, und ich weiß, dass es falsch ist.

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

Ich erhalte die Fehlermeldung:

Object 'Y' not found

Wie erstelle ich die Variable Y, so dass es auf diese neuen Werte basierend auf den Werten von X nehmen können?

Antwort

4

Die Up-Stimmen zu der Frage sehr verwirren mich ... so eine Antwort ist für diese Frage gesucht?

Mit Loop-basierte Verfahren, wie OP vorgesehen ist:

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 
    } 

Die voll vektorisierten Verfahren ist

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

Hier LETTERS sind interne R Konstanten für Großbuchstaben. Es gibt einige Konstanten in R, und Sie können sie alle erhalten, indem Sie die Dokumentation ?Constants lesen.

2

In diesem Fall möchten Sie möglicherweise dplyr::recode in der tidyverse betrachten. Es ist im Wesentlichen eine vektorisierte switch, die scheint, was Sie wollen. Alternativ können Sie eine zweite Datentabelle verwenden und dplyr::left_join oder base::merge verwenden.

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

Option 1: Nehmen Sie die numerischen Werte des Faktors.

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() Tropfen Attribute und wird für die allgemeine fanciness verwendet. as.numeric() könnte besser lesbar sein.

Option 2: Ein Suchvektor.

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 

Daten:

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