【问题标题】:Creating a New Variable Based on a Categorical Variable Already in the Dataset基于数据集中已有的分类变量创建新变量
【发布时间】:2017-01-17 07:07:04
【问题描述】:

假设我有一个包含分类变量 X 的数据集,该变量取值 ABC

我想创建一个新变量Y,即

  • 1,如果X = A;
  • 2,如果X = B;
  • 3,如果X = C

这是我目前所拥有的,我知道这是不正确的。

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

我不断收到错误:

找不到对象“Y”

如何创建变量Y,以便它可以根据X 的值采用这些新值?

【问题讨论】:

    标签: r


    【解决方案1】:

    选项 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)
    

    【讨论】:

      【解决方案2】:

      对这个问题的投票让我非常困惑……所以这个问题需要答案吗?

      使用基于循环的方法,正如 OP 所期望的那样:

      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 来获取它们。

      【讨论】:

        【解决方案3】:

        在这种情况下,您可能需要考虑tidyverse 中的dplyr::recode。它本质上是一个矢量化的switch,这似乎是你想要的。或者,您可以使用第二个数据表并使用dplyr::left_joinbase::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
        

        【讨论】:

          猜你喜欢
          • 2018-06-05
          • 1970-01-01
          • 2019-06-28
          • 2016-09-15
          • 2019-07-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-05
          • 1970-01-01
          相关资源
          最近更新 更多