数据重新编码
问题
你想重新编码数据或从现有的数据中计算生产新的数据列。
方案
下面的例子将使用这些数据:
data <- read.table(header=T, text='subject sex control cond1 cond21 M 7.9 12.3 10.72 F 6.3 10.6 11.13 F 9.5 13.1 13.84 M 11.5 13.4 12.9')
重新编码分类变量
最简单的方法是使用plyr包里的revalue()或mapvalues()。这可以令M为1、F为2,并把它放在一个新生产的列。注意,这两个函数均保存数据类型:如果输入一个因子,输出将会是一个因子;如果输入是一个字符串向量,输出将会是一个字符串向量。
library(plyr)# 下面两行是等价的:data$scode <- revalue(data$sex, c("M"="1", "F"="2"))data$scode <- mapvalues(data$sex, from = c("M", "F"), to = c("1", "2"))data#> subject sex control cond1 cond2 scode#> 1 1 M 7.9 12.3 10.7 1#> 2 2 F 6.3 10.6 11.1 2#> 3 3 F 9.5 13.1 13.8 2#> 4 4 M 11.5 13.4 12.9 1# data$sex是一个因子,因此data$scode也是因子
详见Manipulating Data - 映射向量的值
如果你不想依赖plyr,你可以使用R内置函数:
data$scode[data$sex=="M"] <- "1"data$scode[data$sex=="F"] <- "2"# 把列转换为因子data$scode <- factor(data$scode)data#> subject sex control cond1 cond2 scode#> 1 1 M 7.9 12.3 10.7 1#> 2 2 F 6.3 10.6 11.1 2#> 3 3 F 9.5 13.1 13.8 2#> 4 4 M 11.5 13.4 12.9 1
另一种方法是使用match函数:
oldvalues <- c("M", "F")newvalues <- factor(c("g1","g2")) # 因子data$scode <- newvalues[ match(data$sex, oldvalues) ]data#> subject sex control cond1 cond2 scode#> 1 1 M 7.9 12.3 10.7 g1#> 2 2 F 6.3 10.6 11.1 g2#> 3 3 F 9.5 13.1 13.8 g2#> 4 4 M 11.5 13.4 12.9 g1
将一个连续变量编码为分类变量
标记这些值,control值小于7为“low”,大于或等于7为“high”:
data$category[data$control< 7] <- "low"data$category[data$control>=7] <- "high"# 把列转换为因子data$category <- factor(data$category)data#> subject sex control cond1 cond2 scode category#> 1 1 M 7.9 12.3 10.7 g1 high#> 2 2 F 6.3 10.6 11.1 g2 low#> 3 3 F 9.5 13.1 13.8 g2 high#> 4 4 M 11.5 13.4 12.9 g1 high
用cut函数,可以指定上下限:
data$category <- cut(data$control,breaks=c(-Inf, 7, 9, Inf),labels=c("low","medium","high"))data#> subject sex control cond1 cond2 scode category#> 1 1 M 7.9 12.3 10.7 g1 medium#> 2 2 F 6.3 10.6 11.1 g2 low#> 3 3 F 9.5 13.1 13.8 g2 high#> 4 4 M 11.5 13.4 12.9 g1 high
默认情况下,范围是左边开放、右边关闭,如(7,9]。使用right= FALSE可以设置成左边关闭、右边开放,像[7、9)。
计算得到一个新的连续变量
假设您想添加一个新列,为三个量的和。
data$total <- data$control + data$cond1 + data$cond2data#> subject sex control cond1 cond2 scode category total#> 1 1 M 7.9 12.3 10.7 g1 medium 30.9#> 2 2 F 6.3 10.6 11.1 g2 low 28.0#> 3 3 F 9.5 13.1 13.8 g2 high 36.4#> 4 4 M 11.5 13.4 12.9 g1 high 37.8
原文链接:http://www.cookbook-r.com/Manipulating_data/Recoding_data/
