假设我有一个具有分类变量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的值来接受这些新值
发布于 2017-01-16 22:16:36
对这个问题的投票结果让我很困惑.所以这个问题需要一个答案吗?
使用基于循环的方法,正如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来获得它们。
发布于 2017-01-16 22:21:00
选项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 1c()删除属性,并用于一般的幻想。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)发布于 2017-01-16 22:19:08
在本例中,您可能希望在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 lasthttps://stackoverflow.com/questions/41685428
复制相似问题