[R]_使用grepl()和正则表达式对文本数据进行独热编码(One-Hot Encoding)

发布于:2023-01-04 ⋅ 阅读:(385) ⋅ 点赞:(0)

        说实话,我觉得独热编码这个独热编码翻译实在是拗口,甚至它的英文名One-Hot Encoding都要好听一点,其实对学习统计的同学,可能虚拟变量/哑变量(dummy variable)更加亲切一点,其实独热编码和虚拟变量/哑变量就是一回事。那么为什么用grepl()来做这个事儿呢,因为grepl()返回的是逻辑变量,也就是True和Flase,把True设为1,把Flase设为0就能轻松地完成One-Hot编码。下面来举例。

        原始数据集data长这样。

         第1个任务,把其中含“u”的字段设为1,其余设为0

library(dplyr)

data_1=data%>%
  mutate(new_v=ifelse(grepl("u",v1),1,0))

         这里mutate()是增加一列,ifelse()是把True设为1,Flase设为0,新数据集长这样。

         第2个任务,把含有“u”且不包含“a”的字段设为1,其余设为0。

data_2=data%>%
  mutate(new_v=ifelse(grepl("u",v1)&!grepl("a",v1),1,0))

        这里!grepl()就是筛选不包含“a”的字段,用&连接就能完成我们的任务,数据集长这样。

        

          第3个任务,把“u”和“a”之间间隔1个字符的字段设为1,其余设为0,这时就要用到正则表达式了,正则表达式里“.”代表任意一个字符。

data_3=data%>%
  mutate(new_v=ifelse(grepl("u.a",v1),1,0))

          这里“u.a”的意思就是u和a之间有任意一个字符,其实我们看得到,满足这个条件的就是最后一行"qwuipeura",它最后的“ura”满足这个条件。得到的数据集长这样。

         第4个任务,把“u”和“a”之间间隔一个及多个字符的字段设为1,其余设为0,这时就要用“.*”,正则表达式里“.*”代表一个及多个字符。

data_4=data%>%
  mutate(new_v=ifelse(grepl("u.*a",v1),1,0))

        得到的数据集长这样,“u”和“a”之间间隔一个及多个字符的字段都被筛出来了。

         第5个任务,把“u”和“a”之间间隔2-4个字符的字段设为1,其余设为0,这时就要用“.{x1,x2}”,正则表达式里“.{x1,x2}”代表字符数的范围。

data_5=data%>%
  mutate(new_v=ifelse(grepl("u.{2,4}a",v1),1,0))

        得到的数据集长这样,可以看到间隔4个字符的"uhejda"被筛出来了。

        第6个任务,把以“h”开头的字段设为1,其余设为0,这时就要用“^”。

data_6=data%>%
  mutate(new_v=ifelse(grepl("^h",v1),1,0))

        得到的数据集长这样。这样就把以“h”开头的字段筛出来了。

        第7个任务,把以“a”结尾的字段设为1,其余设为0,这时就要用“#”。

data_7=data%>%
  mutate(new_v=ifelse(grepl("a$",v1),1,0))

        得到的数据集长这样。这样就把以“a”结尾的字段筛出来了。

         在这里讲了使用grepl()和正则表达式对文本数据进行One-hot编码,这几种是最常见也最基础的正则表达式,其实正则表达式还有更高级的用法,感兴趣的同学可以深入学习,后面有机会我也会做一个更系统的总结。

本文含有隐藏内容,请 开通VIP 后查看