如何在 R 中重新编码变量
How to recode variables in R
我正在尝试重新编码 R 数据框中的变量。示例 - 我的数据集中的变量 X 包含 1 和 0。我想创建另一个变量 Y,它将 X 中的 1 和 0 分别重新编码为 Yes 和 No。
我试过这个来创建重新编码的 Y 变量:
w <- as.character()
for (i in seq_along(x)) {
if (x[i] == 1) {
recode <- "Yes"
} else if (x[i] == 0) {
recode <- "No"
}
w <- cbind(w, recode)
}
然后我这样做是为了将 X 和 Y 排列在一起:
y <- c(x, y)
我得到的是这样的:
y
# [1] "1" "1" "0" "1" "0" "0" "1" "1" "0" "1" "0" "0" "Yes" "Yes" "No" "Yes" "No" "No"
我期待一个包含 X 和 Y 列的数据框。
问题:
- 如何将 X 和 Y 放入数据框中?
- 是否有更好的方法在数据框中重新编码变量?
使用以下数据:
x <- c(rep.int(0, 10), rep.int(1, 10))
df <- as.data.frame(x)
df
# x
# 1 0
# 2 0
# 3 0
# ...
我将创建一个新变量并一步重新编码:
df$y[df$x == 1] <- "yes"
df$y[df$x == 0] <- "no"
df
# x y
# 1 0 no
# 2 0 no
# 3 0 no
# ...
# 11 1 yes
# 12 1 yes
# 13 1 yes
# ...
注意 for
循环在 R 中不是最优的,但你的循环基本上是正确的。您需要在循环本身中将 w <- rbind(w, recode)
替换为 w <- cbind(w, recode)
,并且在最后一步中,您可以 cbind
x
和 w
:
w <- as.character()
for (i in seq_along(x)) {
if (x[i] == 1) {
recode <- "Yes"
} else if (x[i] == 0) {
recode <- "No"
}
w <- rbind(w, recode)
}
y <- c(x, w)
y
rbind()
追加行,cbind()
追加列,c()
将两个字符串连接在一起,这就是为什么您将两个列表连接在一起的原因。
这是您真的不应该在 R 中使用循环的众多情况之一。
相反,使用矢量化,即 ifelse
或索引。
result = data.frame(x = x, y = ifelse(x == 1, 'yes', 'no'))
(假设输入中只有 1 和 0;如果不是这种情况,则需要嵌套 ifelse
或包含翻译的列表)。
重新编码通常是将新标签应用于因子(分类变量)的水平
在 R 中,您可以这样做:
w <- factor(x, levels = c(1,0), labels = c('yes', 'no'))
我正在尝试重新编码 R 数据框中的变量。示例 - 我的数据集中的变量 X 包含 1 和 0。我想创建另一个变量 Y,它将 X 中的 1 和 0 分别重新编码为 Yes 和 No。
我试过这个来创建重新编码的 Y 变量:
w <- as.character()
for (i in seq_along(x)) {
if (x[i] == 1) {
recode <- "Yes"
} else if (x[i] == 0) {
recode <- "No"
}
w <- cbind(w, recode)
}
然后我这样做是为了将 X 和 Y 排列在一起:
y <- c(x, y)
我得到的是这样的:
y
# [1] "1" "1" "0" "1" "0" "0" "1" "1" "0" "1" "0" "0" "Yes" "Yes" "No" "Yes" "No" "No"
我期待一个包含 X 和 Y 列的数据框。
问题:
- 如何将 X 和 Y 放入数据框中?
- 是否有更好的方法在数据框中重新编码变量?
使用以下数据:
x <- c(rep.int(0, 10), rep.int(1, 10))
df <- as.data.frame(x)
df
# x
# 1 0
# 2 0
# 3 0
# ...
我将创建一个新变量并一步重新编码:
df$y[df$x == 1] <- "yes"
df$y[df$x == 0] <- "no"
df
# x y
# 1 0 no
# 2 0 no
# 3 0 no
# ...
# 11 1 yes
# 12 1 yes
# 13 1 yes
# ...
注意 for
循环在 R 中不是最优的,但你的循环基本上是正确的。您需要在循环本身中将 w <- rbind(w, recode)
替换为 w <- cbind(w, recode)
,并且在最后一步中,您可以 cbind
x
和 w
:
w <- as.character()
for (i in seq_along(x)) {
if (x[i] == 1) {
recode <- "Yes"
} else if (x[i] == 0) {
recode <- "No"
}
w <- rbind(w, recode)
}
y <- c(x, w)
y
rbind()
追加行,cbind()
追加列,c()
将两个字符串连接在一起,这就是为什么您将两个列表连接在一起的原因。
这是您真的不应该在 R 中使用循环的众多情况之一。
相反,使用矢量化,即 ifelse
或索引。
result = data.frame(x = x, y = ifelse(x == 1, 'yes', 'no'))
(假设输入中只有 1 和 0;如果不是这种情况,则需要嵌套 ifelse
或包含翻译的列表)。
重新编码通常是将新标签应用于因子(分类变量)的水平
在 R 中,您可以这样做:
w <- factor(x, levels = c(1,0), labels = c('yes', 'no'))