我们经常用到替换,最常用的命令是sub或者gsub,这两个命令相当强大,但是也有缺点,比如每次只能操作1个替换对象,如果需要批量替换,则需要替换很多次,而且不能作用于数据框和矩阵。
基于此,我重新封装了gsub命令,写了Replace和Replace0两个命令,来更加灵活地替换,并将这两个命令放入do包(data operator)。
该命令有2大优势:
优势1:适用于多种数据类型,包括:数字、字符串、向量、数据框、矩阵,不适合于列表和数组。
优势2:3种替换模式。
模式1、多个替换为1个,比如讲a、b、c都替换为d
模式2、单个替换为单个,比如同时实现a替换b,c替换为d,3替换为4
模式3、以上2种模式同时使用:注意,优先处理模式1,然后再处理模式2.
首先安装do包:
代码语言:javascript复制install.packages("do")
调用do包
代码语言:javascript复制library(do)
1、数字替换
①多个替换为1个:如将3个数字145,124,154种的1替换都为6
代码语言:javascript复制Replace(data=c(145,124,154),from=1,to=6)
输出的结果
[1] "645" "624" "654"
上面的命令中,data是我们处理的数据,from是替换的对象,to是替换成的目标。
②单个替换为单个:还是上面的数据,把1替换为6,5替换为7
代码语言:javascript复制replace(data=c(145,124,154),pattern=c("1:6","5:7"))
输出的结果
[1] "647" "624" "674"
上面的命令中,data是我们处理的数据,pattern即是单个替换单个模式,每一个替换模式都要用引号引起来,第一个替换是1替换成6,冒号前面是from,冒号后面是to,所以 "1:6" 就是1替换为6,"5:7" 就是5替换为7。
③两种模式同时:优先处理模式1,后处理模式2.
将3个数字1234,1567,8746,将1和2替换为9;3替换为8,6替换为0
代码语言:javascript复制replace(data=c(1234,1567,8746),
from=c(1,2),to=9,
pattern=c("3:8","6:0"))
输出的结果:
[1] "9984" "9507" "8740"
2、字符串替换
和数字替换完全类似,举一个模式3的例子
将monday、tuesday、thursday中的a和y替换为ok;s替换为h,d替换为e
代码语言:javascript复制Replace(data=c("monday","tuesday","thursday"),
from=c("a","y"),to="ok",
pattern=c("s:h","d:e"))
输出的结果:
[1] "moneokok" "tueheokok" "thurheokok"
3、数据框和矩阵※※※
数据框和矩阵的操作完全一样,当对数据框和矩阵操作的时候,更能显示Replace的优势,比如,我们有一个数据框df
代码语言:javascript复制df
var1 var2 var3
123 abc 1a2b
125 bcd 4b6
653 jhg j4h
现在我们来展示模式3.
我们想去掉数据中的1和a;
将5替换为7,将a替换为z,将b替换为k,将h替换为e
代码语言:javascript复制Replace(data = df,
from = c("1","a"),to = "",
pattern = c("5:7","a:z","h:e"))
输出的结果:
var1 var2 var3
23 bc 2b
27 bcd 4b6
673 jeg j4e
如果想把谁去掉,那就把to赋值空字符串"",就可以了。
4、Replace0
很多时候,我们需要把某些内容去掉,所以,为了方便,我写了Replace0,最后是零(0),不是英文字母欧(O),Replace0中只有data和from,没有to,也没有pattern,因为它的目的就是去掉。
比如,我们去掉df数据框中的a、b和1
代码语言:javascript复制Replace0(data = df,from = c("a","b","1"))
输出的结果:
var1 var2 var3
23 c 2
25 cd 46
653 jhg j4h
5、正则表达式※※※
Replace是封装了gsub命令,所以理所当然支持正则表达式。
我们要去掉df中的0到4的数字,和a到e的字母
代码语言:javascript复制Replace0(data = df,from = c("[0-4]","[a-e]"))
输出的结果:
var1 var2 var3
5 6
65 jhg jh
总结:Replace命令通过from和to实现多替换为1的功能,通过pattern实现多次1对1的替换,两者结合使用,可以非常方便。Replace0命令实现同时去掉多个对象的功能。Replace和Replace0都支持正则表达式,这一点非常重要。