R基础|do包(2):替换replace

2023-02-28 20:00:30 浏览数 (1)

我们经常用到替换,最常用的命令是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都支持正则表达式,这一点非常重要。

0 人点赞