6.6 数据重新编码

6.6.1 问题

你想重新编码数据或从现有的数据中计算生产新的数据列。

6.6.2 方案

下面的例子将使用这些数据:

  1. data <- read.table(header = T, text = "
  2. subject sex control cond1 cond2
  3. 1 M 7.9 12.3 10.7
  4. 2 F 6.3 10.6 11.1
  5. 3 F 9.5 13.1 13.8
  6. 4 M 11.5 13.4 12.9
  7. ")

6.6.2.1 重新编码分类变量

最简单的方法是使用 plyr 包里的 revalue()mapvalues()。这可以令M1F2,并把它放在一个新生产的列。注意,这两个函数均保存数据类型:如果输入一个因子,输出将会是一个因子;如果输入是一个字符串向量,输出将会是一个字符串向量。

  1. library(plyr)
  2. # 下面两行是等价的:
  3. data$scode <- revalue(data$sex, c(M = "1", F = "2"))
  4. data$scode <- mapvalues(data$sex, from = c("M", "F"), to = c("1",
  5. "2"))
  6. data
  7. #> subject sex control cond1 cond2 scode
  8. #> 1 1 M 7.9 12.3 10.7 1
  9. #> 2 2 F 6.3 10.6 11.1 2
  10. #> 3 3 F 9.5 13.1 13.8 2
  11. #> 4 4 M 11.5 13.4 12.9 1
  12. # data$sex是一个因子,因此data$scode也是因子

详见映射向量的值

如果你不想依赖 plyr包,你可以使用 R 内置函数:

  1. data$scode[data$sex == "M"] <- "1"
  2. data$scode[data$sex == "F"] <- "2"
  3. # 把列转换为因子
  4. data$scode <- factor(data$scode)
  5. data
  6. #> subject sex control cond1 cond2 scode
  7. #> 1 1 M 7.9 12.3 10.7 1
  8. #> 2 2 F 6.3 10.6 11.1 2
  9. #> 3 3 F 9.5 13.1 13.8 2
  10. #> 4 4 M 11.5 13.4 12.9 1

另一种方法是使用 match() 函数:

  1. oldvalues <- c("M", "F")
  2. newvalues <- factor(c("g1", "g2")) # 转换为因子
  3. data$scode <- newvalues[match(data$sex, oldvalues)]
  4. data
  5. #> subject sex control cond1 cond2 scode
  6. #> 1 1 M 7.9 12.3 10.7 g1
  7. #> 2 2 F 6.3 10.6 11.1 g2
  8. #> 3 3 F 9.5 13.1 13.8 g2
  9. #> 4 4 M 11.5 13.4 12.9 g1

6.6.2.2 将一个连续变量重编码为分类变量

标记 control 值小于 7 为 low,大于或等于 7 为 high

  1. data$category[data$control < 7] <- "low"
  2. data$category[data$control >= 7] <- "high"
  3. # 把列转换为因子
  4. data$category <- factor(data$category)
  5. data
  6. #> subject sex control cond1 cond2 scode category
  7. #> 1 1 M 7.9 12.3 10.7 g1 high
  8. #> 2 2 F 6.3 10.6 11.1 g2 low
  9. #> 3 3 F 9.5 13.1 13.8 g2 high
  10. #> 4 4 M 11.5 13.4 12.9 g1 high

cut() 函数,可以指定边限和新值:

  1. data$category <- cut(data$control, breaks = c(-Inf, 7, 9,
  2. Inf), labels = c("low", "medium", "high"))
  3. data
  4. #> subject sex control cond1 cond2 scode category
  5. #> 1 1 M 7.9 12.3 10.7 g1 medium
  6. #> 2 2 F 6.3 10.6 11.1 g2 low
  7. #> 3 3 F 9.5 13.1 13.8 g2 high
  8. #> 4 4 M 11.5 13.4 12.9 g1 high

默认情况下,范围是左边开放、右边关闭,如 (7,9] 。使用 right= FALSE 可以设置成左边关闭、右边开放,像 [7、9)

6.6.2.3 计算得到一个新的连续变量

假设您想添加一个新列,为三个量的和。

  1. data$total <- data$control + data$cond1 + data$cond2
  2. data
  3. #> subject sex control cond1 cond2 scode category total
  4. #> 1 1 M 7.9 12.3 10.7 g1 medium 30.9
  5. #> 2 2 F 6.3 10.6 11.1 g2 low 28.0
  6. #> 3 3 F 9.5 13.1 13.8 g2 high 36.4
  7. #> 4 4 M 11.5 13.4 12.9 g1 high 37.8