基于数据集中的分类变量创建新变量

时间:2017-01-16 21:40:20

标签: r

假设我有一个分类变量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的值来处理这些新值?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:4)

对这个问题进行投票大大困扰了我......所以这个问题需要答案吗?

使用基于循环的方法,如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来获取它们。

答案 2 :(得分:2)

在这种情况下,您可能需要考虑dplyr::recode中的tidyverse。它本质上是一个矢量化的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