2017-01-16 11 views
5

में पहले से ही एक नया वैरिएबल एक स्पष्ट चर के आधार पर बनाया जा रहा है मान लीजिए मैं एक स्पष्ट चर X कि मूल्यों A, B, या C लेता है के साथ एक डाटासेट है।डेटासेट

मैं एक नया चर 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 
    } 

पूरी तरह से vectorized विधि,

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

यहाँ, LETTERS बड़े अक्षरों के लिए आंतरिक आर स्थिरांक हैं है। आर में कुछ स्थिरांक हैं, और आप उन्हें दस्तावेज ?Constants पढ़कर सभी प्राप्त कर सकते हैं।

2

इस मामले में, आप में dplyr::recode पर विचार करना चाहेंगे। यह अनिवार्य रूप से एक वेक्टरकृत 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() विशेषताओं चला जाता है, और सामान्य fanciness के लिए प्रयोग किया जाता है। 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) 
संबंधित मुद्दे