【问题标题】:How to recode variables in R如何在 R 中重新编码变量
【发布时间】:2015-12-07 12:10:59
【问题描述】:

我正在尝试重新编码 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. 有没有更好的方法来重新编码数据框中的变量?

【问题讨论】:

  • 你的循环的输出是 w 并且它不在后面......它应该是 y
  • 而且不需要循环。使用类似ifelse
  • 使用factor(x, levels=c(0, 1), labels=c("No", "Yes")) 代替循环。
  • @MLavoie, cbind 在使用data.frame 时不是必需的(如果在原子向量上调用,它将首先强制转换为matrix,这可能会导致对单个列的意外强制)跨度>
  • 你看过 plyr 中的“revalue”吗?

标签: r recode


【解决方案1】:

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

在 R 中,你可以这样做:

w <- factor(x, levels = c(1,0), labels = c('yes', 'no'))

【讨论】:

  • 嗯,不知道你有没有看到半小时前的评论,只是复制/粘贴...
  • @David 也许是这样,但随后评论者取消了他们在半小时内将其发布为正确答案的权利。
  • @KonradRudolph 在没有任何归属的情况下仍然不合适。更多 this was already discussed many times on Meta.
  • @David 当然,但这个答案增加了更多 - 即解释。如果它只是复制评论,我会同意。
  • @KonradRudolph 根据我的经验,您不会同意任何事情我会说,但这是简单的复制/粘贴,带有一些明显的注释。这就像从你的同学那里复制/粘贴家庭作业并稍微改写一下,这样老师就不会注意到。无论哪种方式,评论者都应该在这里被提及,只是作为一种适当的行为。
【解决方案2】:

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

改为使用矢量化,即ifelse 或索引。

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

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

【讨论】:

  • 感谢康拉德。你的建议效果很好。但是我现在有一个稍微不同的例子...我创建了以下数据框... x
  • @KYG 将&amp;&amp; 替换为&amp;
【解决方案3】:

使用以下数据:

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 &lt;- rbind(w, recode) 替换为w &lt;- 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-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多