《Cookbook for R》 Manipulating Data ~ General
Recoding data 重新编码数据
示例数据框
{r}
data <- read.table(header=T, text='
subject sex control cond1 cond2
1 M 7.9 12.3 10.7
2 F 6.3 10.6 11.1
3 F 9.5 13.1 13.8
4 M 11.5 13.4 12.9
')
想要重新编码数据
或从现有数据列计算新数据列
1、重新编码分类变量 categorical variable
最简单的方法是使用来自 plyr
包的 revalue()
或 mapvalues()
这将把 M
编码为 1
,把 F
编码为 2
,并把它放在一个新列中
Note:这些函数保留了数据类型:即输入是因子,则输出因子;输入是字符向量,则输出字符向量
第一种方法:用revalue()
或 mapvalues()
{r}
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 也是因子
第二种方法:用R内置函数来做
{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()
函数
{r}
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
Recoding a continuous variable into categorical variable 将连续变量转换为分类变量
将control
测量值<7的标记为"低",将>=7的标记为"高"
{r}
# 先新增一列
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()
函数,可以指定边界和结果值:
{r}
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];要设置范围为左闭右开,如[7,9),使用 right=FALSE
Calculating a new continuous variable 计算新的连续变量
假设要添加一个新列,其中包含三个度量值的总和
{r}
data$total <- data$control + data$cond1 + data$cond2
data
#> 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
Mapping vector values 映射向量值
想在一个向量中将值 x
的所有实例更改为值 y
先创建一个例子
{r}
str <- c("alpha", "beta", "gamma")
num <- c(1, 2, 3)
最简单的方法是使用来自于 plyr
包的 revalue()
或 mapvalues()
:
{r}
library(plyr)
revalue(str, c("beta"="two", "gamma"="three"))
#> [1] "alpha" "two" "three"
mapvalues(str, from = c("beta", "gamma"), to = c("two", "three"))
#> [1] "alpha" "two" "three"
# revalue() 不能用在数值型向量上,它只能修改字符型
# mapvalues() 可以:
mapvalues(num, from = c(2, 3), to = c(5, 6))
#> [1] 1 5 6
也可以用R的内置函数来
Note:这些方法将直接修改向量,即不必将结果保存回变量中
{r}
# 以重命名的方式
str[str=="beta"] <- "two"
str
#> [1] "alpha" "two" "gamma"
num[num==2] <- 5
num
#> [1] 1 5 3
也可以使用R的字符串搜索和替换函数来重新映射字符向量中的值
alpha
周围的 ^
和 $
是为了确保整个字符串匹配。
如果没有它们,如果有一个名为 alphabet
的值,它也会匹配,而替换将是 onebet
{r}
str <- c("alpha", "beta", "gamma")
sub("^alpha$", "one", str)
#> [1] "one" "beta" "gamma"
# 将str中所有元素中的a换成X
gsub("a", "X", str)
#> [1] "XlphX" "betX" "gXmmX"
# gsub() 替换数据中每一个元素对应的所有组分
# sub() 仅替换每一个元素中第一个对应上的组分