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

5
假设我有一个数据集,其中有一个分类变量X,它的值可以是A、B或C。
我想创建一个新变量Y,使得:
- 当X=A时,Y=1; - 当X=B时,Y=2; - 当X=C时,Y=3。
以下是我目前的代码,但我知道它是不正确的。
if(X==A) {
  (Y = 1)
  }
else if(X==B) {
  (Y = 2)
  }
else {
  (Y = 3)
  }

我一直遇到以下错误:

对象“Y”未找到

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

3个回答

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)

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
  }

完全矢量化方法是指使用向量运算来处理数据的一种技术。
Y <- match(X, LETTERS[1:3])

在这里,LETTERS是R语言中表示大写字母的内部常量。R语言中的常量很少,您可以通过阅读文档?Constants获取它们所有的常量。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接