假设我有一个分类变量X
的数据集,其值为A
,B
或C
。
我想创建一个
的新变量Y
X
= A
; X
= B
; X
= C
。这是我到目前为止所做的,我知道这是不正确的。
if(X==A) {
(Y = 1)
}
else if(X==B) {
(Y = 2)
}
else {
(Y = 3)
}
我一直收到错误:
找不到对象'Y'
如何创建变量Y
,以便它可以根据X
的值来处理这些新值?
答案 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_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