0

我正在尝试重新编码 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 列的数据框。

问题:

  1. 如何将 X 和 Y 放入数据框中?
  2. 有没有更好的方法来重新编码数据框中的变量?
4

3 回答 3

3

重新编码通常是关于将新标签应用于因子(分类变量)的水平

在 R 中,你可以这样做:

w <- factor(x, levels = c(1,0), labels = c('yes', 'no'))
于 2015-12-07T12:42:50.830 回答
1

这是您确实不应该在 R 中使用循环的众多情况之一。

相反,使用矢量化,即ifelse或索引。

result = data.frame(x = x, y = ifelse(x == 1, 'yes', 'no'))

(这假设输入中只有 1 和 0;如果不是这种情况,则需要ifelse包含翻译的嵌套或列表)。

于 2015-12-07T12:33:54.100 回答
1

使用以下数据:

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 xw

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()两个字符串连接在一起,这就是为什么您将两个列表连接在一起的原因。

于 2015-12-07T12:29:38.663 回答