r语言 第n行第n列_R语言 | 从森林图说起修改因子型数据的N种方法

235889f4b2c2666eea9c957888c886f2.gif

前文推荐

R语言 | 多组样本的N种组合

R语言 | NA值替换的N种方法

数据挖掘 | ID转换的N种方法

e8b84af05b4d6cb507a2bf3b722da81b.gif

我们在文章 数据挖掘 | 快速实现生存分析森林图 中讲到,可以将原数据中对于性别的0/1标识转换为female/male以方便在森林图中的展示,其中提到的方法如下:

sex = factor(sex, levels = c(0,1), labels = c("female", "male"))

是在将sex变量转化为因子型的同时,将其0和1分别标识为female和male,而本文将讨论对因子型数据内容修改的N种方法!

使用测试数据iris:

data(iris)

str(iris) # 查看数据内容

69f5e08b1024a68ba58a8bf56260d45b.png

可见,物种(Species)列是因子型(Factor)数据,3个组别(levels)分别为:setosa、versicolor和virginica:

66aa672fb920333ca7e7b464d3fa6b57.png

levels(iris$Species) # 提取因子的levels

返回:

[1] "setosa" "versicolor" "virginica"

N种方法开始...

方法1:参考前文,如果现在想将类别名称对应改为0,2,1,可执行如下命令:

iris$Species = factor(iris$Species, levels = c("setosa", "versicolor", "virginica"), labels = c(0, 2, 1))

完成更改("setosa" -> 0, "versicolor" -> 2, "virginica" -> 1):

ea7345cfdb2664e22e84f045a18d8bab.png

注意,levels的顺序并非数值顺序,而是按照设置的顺序!

方法2:方法1的最外层有个转换为因子型数据的操作 factor(),由于其本身已经是因子型,故多余,可直接通过 levels() 更改:

levels(iris$Species) = c("versicolor", "virginica", "setosa")

抛出问题:由方法1中得到的1会被替换成什么?

答:(0 -> "versicolor", 2 -> "virginica", 1 -> "setosa")

方法3:方法2种是按levels顺序依次替换,而方法1则可以根据需求自定义替换规则,当然方法1更为灵活,且不需要事先知道levels的顺序即可完成更改,值得借鉴:

p_load(forcats)

fct_recode(iris$Species, "0" = "virginica", "1" = "versicolor", "2" = "setosa")

注意!forcats包中的函数 fct_recode() 设置替换规则时被替换的原始内容在等号后面,新的内容再等号之前,如果是数值需要加引号,字符串则不需要:

the name gives the new level, and the value gives the old level.

故,如果被替换内容再原levels中不存在,则报错:

fct_recode(iris$Species, virginica = "a")

Warning message: Unknown levels in f: a

另, fct_recode() 并不会改变原变量。故如果想在原变量的基础上修改,则需要重新赋值:

iris$Species = fct_recode(iris$Species, "0" = "virginica", "1" = "versicolor", "2" = "setosa")

此时...

方法4、直接使用 levels() 在原因子型变量上直接修改反而显得更便捷:

levels(iris$Species) = list(no = "0", yes = "1", unknow = "2")

同理,被替换的原始内容在等号后面,新的内容再等号之前!

af9ed0190071337378261c0dcaf9c6aa.png

方法5:不过,tidytidbits包中的 rename_factor() 函数倒是支持更舒服的书写方式,将原始内容在等号后面

p_load(tidytidbits)

rename_factor(iris$Species, no = "setosa", yes = "versicolor", unknow = "virginica"))

方法6-7:类似的,格式不同的还有plyr包中的 revalue()mapvalues() 等函数:

p_load(plyr)

revalue(iris$Species, c(no = "setosa", yes = "versicolor", unknow = "virginica"))

mapvalues(iris$Species, c("no", "yes", "unknow"), c("setosa", "versicolor", "virginica"))

方法8:既然我们总是在说替换,那么怎么能少得了 R中强大的替换操作!

e8b84af05b4d6cb507a2bf3b722da81b.gif

R语言·往期精彩

R语言 | 从火山图说起-条件判断语句

R绘图 | 差点又错过一个隐蔽且致命的错误

R语言 | 更快的表格文件读取方法!

R语言 | 数据如何高效输出到文件中?

如期而至的最新版R语言!

R语言 | 你知道自己的Bioconductor版本么?

R语言 | 多组样本的N种组合

绘图专题 | ggsci发表级配色

f3ae87d186c7598f04f645ca985bfd38.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值