批量字符替换、数值大小比较并重新赋值

  • 起初的循环与嵌套
  • 函数的完善和修改
  • compare_revalue的实际应用

  俗话说的好, 包” 治百病。先前帮师兄处理数据(对数据集的数值比较大小并重新赋值)时写了一个小函数( Function)。经过考虑,为了完善函数把字符型、因子型等情况也纳入进来(可以做批量字符替换),并制作成R包,这便于自己使用。但是,今天不打算与大家分享如何制作R包,而是与大家分享这个函数及其用法。该函数能够批量处理向量、矩阵和数据框中字符、因子和数值向量(数据结构)。其主要功能:批量做字符替换、批量比较数值大小并重新赋值。为了方便使用,我把它作成了R包上传github,这样就不需要每次source或者加载一大串代码。若大家需要或感兴趣可自行下载~

起初的循环与嵌套

在帮师兄处理数据的时候,需要批量处理几千行×几千列数据集中数值大小比较并赋值(因为这个数据集中含有大量小于0的值,但是小于0的值没意义,因为需要把所有小于0的值替换成0;若本身大于0的值则保持原值即可)。先写了一个小函数:下面是我经过思考分别写的两个函数,都可以处理这种情况。一开始没有想着嵌套,因为嵌套在我印象中运行时候特别慢,所以考虑的是先对行或者列做第一次循环,然后补充行或列的第二次循环。这样确实快一些,但是代码看起来就不简洁。代码不简洁,自己看的都不想用。所以后面又补上了嵌套循环。

code 1:
rm(list=ls()) # 清除当前环境变量
set.seed(20220225) #设置种子数,复现相同的结果
test_data <- matrix(runif(1000000, min = -0.5, max = 0.5), nrow = 1000)
dim(test_data) # 查看下构建数据的维度 显示:行 列

# 定义一个与0值作比较的函数,先计算数据集中每列的情况,然后直接用do.call对list做一个cbind就可以得到完成的数据集了
remove_lessthan0 <- function(data, ncol){
result <- data.frame(NA)
for(i in 1:nrow(data)){
result[i,1] = ifelse(data[i,ncol]<=0,0,data[i,ncol]) }
return(result)
}
for(i in 1:ncol(test_data)){
assign(paste("A",i,sep=""), remove_lessthan0(data=test_data, ncol=i))
}

l <- list()
for(i in 1:2010){
df.now <- get(paste0("A",i))
l[[i]] <- df.now
}
total <- do.call(cbind,l)
write.csv(total,"total.csv")

这里直接用嵌套循环的代码就非常简洁:
code 2
remove_lessthan0<- function(data= data){
data<- as.data.frame(data)
dat1<- data.frame()
for(i in 1:nrow(data)){
for(j in 1:ncol(data)){dat1[i,j]<- ifelse(data[i,j]<=0, 0, data[i,j])}
}
return(dat1)
}
a <- remove_lessthan0(data = test_data[1:100,1:100])
write.csv(a,"total.csv")

函数的完善和修改

目前,我已经完善了该函数。由于平时也需要做一些批量字符替换,经过考虑,把字符型、因子型和数值型向量,以及矩阵数据框等情况都纳入,命名为compare_revalue()。主要涉及的参数如下:data,id_cols,from,to,less,greater,equal,revalue,该函数也封装到R包中,名称暂定为DailyTools。希望能做成一个便于自己日常数据处理的R包。大家感兴趣可以通过下面code进行下载:

# install.packages("devtools")
# install.packages("remotes")
devtools::install_github("Jylande/DailyTools")
remotes::install_github("Jylande/DailyTools",force = TRUE)

下载成功以后,我们可以library一下R包。
library(DailyTools)
然后看看对应函数的介绍:
?compare_revalue

从介绍中了解,该函数主要用重新赋值向量。换句话说,既能做批量字符替换,也可以做数值大小比较后的重新赋值(这也是考虑,有时候有的函数可以做字符,有的只能做数值,所以我重新定义了一个即可做字符和数值,也可以做比较的函数)。具体用法如下:compare_revalue(data, id_cols= NULL, from=NULL, to=NULL, less=NULL, greater=NULL, equal=NULL, revalue=NULL)。从函数用法看,多参数存在NULL,这表明都是可交互的,该函数既可以用来替换字符或者因子型向量,也可以做数值大小比较并重新赋值。关于参数名称,为了让大家更容易记住,直接以小于(less),大于(greater),等于(equal)来命名了。

对应参数的介绍如下:

参数解读:

data: 可以是向量、矩阵、数据框等。

id_cols: 数据中指定的列(名称)。参数可以是一个向量或矩阵,或data.frame,例如id_cols = “a”,或id_cols =1,或id_cols = 1:3。

from: 该参数为数据集种需要被替换的字符或者因子。并且需要与to参数联用。如from=A,to=B,表示为将所有A向量替换为B向量。

to: 该参数为目标向量,指的是想把from的字符或因子替换成什么向量?这可以可以是字符、因子也可以是数值向量。

less: 顾名思义,这是一个做数值比较的参数。与该参数相比还小的值,重新赋值为新的目标变量。如:less=0.1。

greater:非常好理解,有小必有大。与该参数相比还大的值,重新赋值为新的目标变量。如:greater=0.1。

equal: 自然少不了相等的。与该参数相等的值,重新赋值为新的目标变量。如:equal=0.1。

revalue:该参数是做数值比较时一个关键参数,必须填写,这是目标变量。比如我想把比较后的值,重新赋值为1,那么revalue=1。

此外,如果想查看源代码,我们直接打上所需查看的函数即可

compare_revalue # 按 enter+ctrl 或者F2 即可

compare_revalue的实际应用

我相信,根据上面的定义,大家轻而易举的就能记住所有的参数。下面进行实际操作。
考虑目前该R包只有一个函数,所以没有构建data,因此下面案例就是随机构建的练习数据。

我们从例子来学习

批量字符或因子型向量的替换:如果想把 “a” 替换成 “A”

est_char <- rep("a", 10)
compare_revalue(test_char, from = "a", to = "A")test_factor <- factor(test_char)
compare_revalue(test_factor, from = "a", to = "A")

批量数值型向量大小比较并重新赋值(当然也可以把数值替换成其他字符向量):我们比较向量中小于0.5的值,重新赋值为1

set.seed(1)
test_num1 <- runif(10, min=-1, max=2)
compare_revalue(data = test_num1, less = 0.5, revalue = 1)

如果是想比较大于等于的话,再添加一个equal参数就可以。

test_num2 <- c(0, 2, 1, 3, 4, -0.5, -0.11, -0.25, 0.5, 1.5, 2.5, 0.5)
compare_revalue(data = test_num2, greater = 0.5, equal  = 0.5, revalue = 1)

最后以矩阵和数据框为例子,进行批量处理。

set.seed(1)
test_matrix1 <- matrix(runif(1000000, min = -0.5, max = 1), nrow = 1000)
result1 <- compare_revalue(data = test_matrix1[1:100,1:500],less = 0.5, equal = 0.5, revalue = 0);result1set.seed(1)
test_matrix2 <- data.frame(a = sample(c("a","b","c"), 1000, replace = TRUE),b = sample(c("A","B"), 1000, replace = TRUE),c = sample(c("huawei","apple"), 1000, replace = TRUE),d = sample(c(0, 1), 1000, replace = TRUE))
result2 <- compare_revalue(data = test_matrix2, from = "A", to = "C" );result2set.seed(1)
test_matrix3 <- data.frame(a = sample(c(1,2,3), 1000,replace = TRUE),b = sample(c(5,6,7), 1000, replace = TRUE),c = sample(c(-1,-2,-3), 1000, replace = TRUE),d = sample(c(0, 1), 1000, replace = TRUE))
result3 <- compare_revalue(data = test_matrix3, equal = 0.5, revalue = 0);result3


补充:如果想指定某列或某几列的数据进行批量处理,使用id_cols参数。

result4 <- compare_revalue(data = test_matrix3, id_cols = 1:3, equal = 1, revalue = 0);result4result5 <- compare_revalue(data = test_matrix3, id_cols = 1, equal = 1, revalue = 0);result5result6 <- compare_revalue(data = test_matrix2, id_cols = "b", from = "A", to = "c");result6

自定义函数 | R语言批量字符替换、数值大小比较并赋值相关推荐

  1. 自定义函数 | R语言偏相关分析及绘图

    R语言的偏相关分析过程 偏相关分析介绍 阶偏相关分析: 偏相关系数: Pearson相关系数 Spearman相关系数 Kendall等级相关系数 R语言实现偏相关分析 pcor() pcor.tes ...

  2. 【R语言进阶】不同数值大小的比较

    逻辑数值比较Comparison of logicals TRUE==FALSE 比较数字 -6*14 !=17-101 比较英文字符串Comparison of character strings ...

  3. R语言将字符型(Character)变量转化为数值型(Numeric)

    R语言将字符型(Character)变量转化为数值型(Numeric) 目录 R语言将字符型(Character)变量转化为数值型(Numeric) #基本语法

  4. R语言数据类型基础1 数值型、逻辑型与文本型

    R语言数据类型基础1 数值型.逻辑型与文本型 我看的R语言教材是李东风老师写的,已经跟着写了一周的代码了,但是可能是缺乏练习和总结,我相当于是打了遍字而已.所以现在又回头总结一下,里面一些太过细节的操 ...

  5. c r语言中rank函数,R语言rank函数详细解析

    R语言rank函数详细解析 发布于 2016-01-04 16:26:04 | 557 次阅读 | 评论: 0 | 来源: PHPERZ R 数据统计分析语言R是用于统计分析.绘图的语言和操作环境.R ...

  6. quantile函数r语言_R中的Quantile()函数-简要指南

    quantile函数r语言 You can generate the sample quantiles using the quantile() function in R. 您可以使用R中的Quan ...

  7. 安卓最好的浏览器_今日软件 | AI一键抠图、隐私保护工具、全能下载器、安卓启动器、茄子快传、迅雷、批量字符替换、傲游浏览器、全局负一屏...

    今日软件更新 安卓APP 「SHAREit」5.7.18 # 茄子快传,手机文件传输工具 ▾下载:https://lanzoux.com/iyyn4hdfs9c 「QuickEdit」1.7.0 # ...

  8. R语言批量读取txt文件并合并

    气象数据处理-R语言批量读取txt数据并合并 处理地面气候资料日值数据集v3.0 数据集以月为单位存储,每个月是一个单独的文件,上图. 在处理数据过程中,我们往往会将单独的数据合并到一起做进一步分析, ...

  9. R语言批量提取excel当中的数据

    使用R语言批量提取excel文件 前言 步骤 总结 前言 在工作当中,为了方便统计单项数据,经常会遇上同一格式的几百份数据项需要提取到同一个表格的情况,博主非计算机专业,R语言代码不一定规范,但是经验 ...

最新文章

  1. Python+OpenCV 图像处理系列(3)—— 画线、矩形、画圆、画椭圆、画多边形
  2. C++:随笔2--I/O实践
  3. 07、C语言——函数
  4. html 常用方法,jquery的常用方法有哪些?
  5. JavaSE的一些基础内容
  6. Attention和增强RNN (Attention and Augmented Recurrent Neural Networks)
  7. activemq端口好_ActiveMQ已准备好黄金时段
  8. 数据库的移动 1007 sqlserver
  9. Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.4.4 延迟初始化的bean...
  10. Oracle In Memory最佳实践(附PPT和视频回放)
  11. linux如何确认账号过期了,linux下非root用户秘密过期如何确认,如果确认,该如何延期使其有效?...
  12. Robotframework--随机选取下拉框的字段值进行搜索
  13. 如何定义用户模型(persona)
  14. C语言阶梯电费函数,用阶梯电价计算逻辑学习销售人员阶梯提成计算函数
  15. 第十五周项目一----哈希表的运算及实现
  16. Android 沉浸式(透明)状态栏细研-超级细还附 Demo
  17. 【MySQL--03】表的操作
  18. 从all-merged-Graph-Based Genes.csv 提取出 average expression avglogfc 或者pval doheatmap
  19. 嵌入式软件工程师—成长笔记#02
  20. SDNU1129.多度人脉

热门文章

  1. 血浆p-Tau181在Tau沉积中的预测作用
  2. 拉塞尔不变性定理 ( LaSalle's invariance principle )
  3. 走进FileNet CE-了解ECM(企业内容管理)
  4. 第690期 | 意大利为什么会出现黑手党?(解决问题不能只看当下)
  5. s6 edge编译android,三星在为S6和S6 edge开发Android 5.1升级包
  6. paraview中的网格显示设置
  7. css实现带小三角形的边框
  8. Core Java 8 读书笔记-Networking编程
  9. 运营拉新怎么做?用户拉新的10个方法(下)
  10. 阿里是如何做Code Review的