前几天帮人写代码,处理一个表格,他的表格里面有个问题就是希望将1.8万这样的东西处理成18000。
就像是下面这样的:
这个其实对初学者来说比较难,那个同学的做法是将“1.8万”中的“万替换成“*10000”,然后再转换成数值型。其实这样想很正常,刚开始不都这样么。
那么我们就按照错误思维来试一试。
很明显,产生了NA,缺失值。
那么正确的做法是什么样的??
如下:
t_a 是新建一个向量,然后使用stringr包的str_detect()函数检验这个向量里面是否含有”万“这个字,如果向量原子里面有”万“这个字的,就判断为TRUE,不然就是FALSE
将结果为TRUE的原子选出来然后把万用”“替换掉。再转换为数值型然后乘以10000
如下图:32行的str_replace()函数将1.8万里面的万用空的双引号替换掉,实际上,这个双引号里面什么都没有,都没有空格
然后33行下面得到一个结果,”1.8“这里的1.8是字符型。
然后在37行将字符型转换成数值型然后再乘以10000即可,从而可以替换。
下面就是一个向量化操作,因为stringr包支持对字符向量进行操作,毕竟我们不是为了一个一个改,是批量化处理。
40行到41行是将含有“万”的位置找出来,然后将这个位置的原子里面的万给用空白替换掉。然后再把它放回去。简单的来说就是有一排干干净净的苹果,将带有伤疤的苹果用刀削掉,然后再把苹果放回原处。这样都没有伤疤虫眼了,哈哈哈
上面就是最终的结果。
实际上,上面适用于1.8, 2.0, 1.8万都是以万为单位的。而1.8万代表是多出来的万
如果是这样的数组怎么办。就是不是所有的转换之后的都要乘以10000.其实这个也很简单。
52行是将含有万的提出来,然后进行上面操作
然后将整个data转换成数值型,然后进行操作。
讲解完基础的,然后应用到那个同学问我的案例上,他要将一个excel表格里面的c到j列里面含有万的都要替换成这样的格式,其实很简单啦:数据再我的github上面:docum.xlsx 点击链接到我github上去下载。
代码如下:
library(readxl)
library(stringr)
data <- read_xlsx("docum.xlsx")
for (i in colnames(data)[3:10]) {
data[str_detect(data[, i, drop = TRUE],
"万"), i] <- as.numeric(as.character(str_replace(
data[str_detect(data[, i, drop = TRUE], "万"),
i, drop = TRUE], "万", ""))) * 10000
data[, i] <- as.numeric(data[, i, drop = TRUE])
} #清洗完毕
#接下来的data就是干净的了
write.csv(data, "clearn_docum.csv")