R语言 数据的整理与清洗(第二篇)

《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() 仅替换每一个元素中第一个对应上的组分
相关推荐
数据猎手小k6 小时前
AIDOVECL数据集:包含超过15000张AI生成的车辆图像数据集,目的解决旨在解决眼水平分类和定位问题。
人工智能·分类·数据挖掘
sp_fyf_20247 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
陈燚_重生之又为程序员7 小时前
基于梧桐数据库的实时数据分析解决方案
数据库·数据挖掘·数据分析
几两春秋梦_11 小时前
符号回归概念
人工智能·数据挖掘·回归
艾派森13 小时前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
让学习成为一种生活方式16 小时前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
武子康18 小时前
大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和
大数据·人工智能·学习·算法·机器学习·数据挖掘
Q81375746018 小时前
数据挖掘在金融交易中的应用:民锋科技的智能化布局
人工智能·科技·数据挖掘
布说在见18 小时前
魅力标签云,奇幻词云图 —— 数据可视化新境界
信息可视化·数据挖掘·数据分析
Tianyanxiao19 小时前
如何利用探商宝精准营销,抓住行业机遇——以AI技术与大数据推动企业信息精准筛选
大数据·人工智能·科技·数据分析·深度优先·零售