使用函数重新编码R中的变量

时间:2018-08-14 10:19:01

标签: r variables recode

我正在尝试重新编码其小数位数如下的变量:0、11、1、2、3、4、5、6、7、8、9、10。从0自然增加到11。我正在使用以下(笨拙的)代码:

for (i in 1:22){
  if (data2[i,"mus_post_borg_di"] == 0) {
    data2[i,"mus_post_borg_di_rescale"] <- 0
  }
  else if (data2[i,"mus_post_borg_di"] == 11) {
    data2[i,"mus_post_borg_di_rescale"] <- 1
  }
  else if (data2[i,"mus_post_borg_di"] == 1) {
    data2[i,"mus_post_borg_di_rescale"] <- 2
  }
  else if (data2[i,"mus_post_borg_di"] == 2) {
    data2[i,"mus_post_borg_di_rescale"] <- 3
  }
  else if (data2[i,"mus_post_borg_di"] == 3) {
    data2[i,"mus_post_borg_di_rescale"] <- 4
  }
  else if (data2[i,"mus_post_borg_di"] == 4) {
    data2[i,"mus_post_borg_di_rescale"] <- 5
  }
  else if (data2[i,"mus_post_borg_di"] == 5) {
    data2[i,"mus_post_borg_di_rescale"] <- 6
  }
  else if (data2[i,"mus_post_borg_di"] == 6) {
    data2[i,"mus_post_borg_di_rescale"] <- 7
  }
  else if (data2[i,"mus_post_borg_di"] == 7) {
    data2[i,"mus_post_borg_di_rescale"] <- 8
  }
  else if (data2[i,"mus_post_borg_di"] == 8) {
    data2[i,"mus_post_borg_di_rescale"] <- 9
  }
  else if (data2[i,"mus_post_borg_di"] == 9) {
    data2[i,"mus_post_borg_di_rescale"] <- 10
  }
  else if (data2[i,"mus_post_borg_di"] == 10) {
    data2[i,"mus_post_borg_di_rescale"] <- 11
  }
}

运行此命令将重新编码所需的内容。但是,由于我正在使用相同比例的其他变量,因此我决定编写一个避免不必要的复制/粘贴的函数:

borg_rescale_fct <- function(x, y){
 for (i in 1:22){
  if (data2[i,x] == 0) {
    data2[i,y] <- 0
  }
  else if (data2[i,x] == 11) {
    data2[i,y] <- 1
  }
  else if (data2[i,x] == 1) {
    data2[i,y] <- 2
  }
  else if (data2[i,x] == 2) {
    data2[i,y] <- 3
  }
  else if (data2[i,x] == 3) {
    data2[i,y] <- 4
  }
  else if (data2[i,x] == 4) {
    data2[i,y] <- 5
  }
  else if (data2[i,x] == 5) {
    data2[i,y] <- 6
  }
  else if (data2[i,x] == 6) {
    data2[i,y] <- 7
  }
  else if (data2[i,x] == 7) {
    data2[i,y] <- 8
  }
  else if (data2[i,x] == 8) {
    data2[i,y] <- 9
  }
  else if (data2[i,x] == 9) {
    data2[i,y] <- 10
  }
  else if (data2[i,x] == 10) {
    data2[i,y] <- 11
  }
}

我想打以下电话:

borg_recode_fct("mus_base_borg_di", "mus_base_borg_di_rescale")

会工作。它不会,并返回所有NA。

我意识到这是重新编码的一种非常笨拙的方法。将其转换为因子变量并施加顺序会更好吗?谢谢!

1 个答案:

答案 0 :(得分:0)

使用 levels 参数,例如:

x <- c(0, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
# [1]  0 11  1  2  3  4  5  6  7  8  9 10

factor(x, levels = c(0, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
#  [1] 0  11 1  2  3  4  5  6  7  8  9  10
# Levels: 0 11 1 2 3 4 5 6 7 8 9 10

as.numeric(factor(x, levels = c(0, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10))) - 1
# [1]  0  1  2  3  4  5  6  7  8  9 10 11