R语言 数据的整理与清洗(第一篇)

《Cookbook for R》 Manipulating Data ~ General

Sorting 排序

1、vectors 向量

# 先随机生成一组向量
v <- sample(101:110)# 排序sort()
sort(v)
#>  [1] 101 102 103 104 105 106 107 108 109 110# 反向排序
sort(v, decreasing=TRUE)
#>  [1] 110 109 108 107 106 105 104 103 102 101

2、data frames 数据框
要对一个或多个列上的数据帧进行排序,可以使用 plyr 包中的 arrange()

# 生成一个数据框
df <- data.frame (id=1:4,weight=c(20,27,24,22),size=c("small", "large", "medium", "large"))
dflibrary(plyr)# 按weight这一列排序
arrange(df, weight)       # 使用arrange函数
df[ order(df$weight), ]   # 使用R自带函数
#>   id weight   size
#> 1  1     20  small
#> 2  4     22  large
#> 3  3     24 medium
#> 4  2     27  large# 按size排序,再按weight排序
arrange(df, size, weight)         
df[ order(df$size, df$weight), ] 
#>   id weight   size
#> 4  4     22  large
#> 2  2     27  large
#> 3  3     24 medium
#> 1  1     20  small# 按所有列进行排序,列的顺序从左到右
df[ do.call(order, as.list(df)), ] 

Note:size这一列是因子,按因子水平的顺序排序;在这种情况下,级别是自动分配的(在创建数据框时),因此large是第一个,small是最后一个。

3、reverse sort 反向排序

排序的整体顺序可以用参数 decreasing=TRUE 颠倒

若要反转特定列的方向,该方法取决于数据类型:

  1. Numbers:在变量名前面加上 - ,例如 df[ order(-df$weight), ] ;
  2. Factors:转换为整数,并在变量名前面加上 - ,例如 df[ order(-xtfrm(df$size)), ] ;
  3. Characters: 没有一个简单的方法可以做到这一点。一种方法是先转换为因子,然后如上所述进行排序
# 按weight这一列反向排序 
arrange(df, -weight)                      # 使用arrange函数
df[ order(df$weight, decreasing=TRUE), ]  # 使用R自带函数
df[ order(-df$weight), ]                  # 使用R自带函数
#>   id weight   size
#> 2  2     27  large
#> 3  3     24 medium
#> 4  4     22  large
#> 1  1     20  small# 按 size (increasing), 然后按 weight (decreasing)
arrange(df, size, -weight)        
df[ order(df$size, -df$weight), ]  
#>   id weight   size
#> 2  2     27  large
#> 4  4     22  large
#> 3  3     24 medium
#> 1  1     20  small# 按 size (decreasing), 然后按 weight (increasing)
# R自带函数 xtfrm() ,用于生成一个数字向量
arrange(df, -xtfrm(size), weight)         # Use arrange from plyr package
df[ order(-xtfrm(df$size), df$weight), ]  # Use built-in R functions
#>   id weight   size
#> 1  1     20  small
#> 3  3     24 medium
#> 4  4     22  large
#> 2  2     27  large

Randomizing order 随机化排序

当你想随机化排序时

# 先创造一个向量
v <- 11:20# 使向量随机化
v <- sample(v)# 再创建一个数据框
data <- data.frame(label=letters[1:5], number=11:15)
data
#>   label number
#> 1     a     11
#> 2     b     12
#> 3     c     13
#> 4     d     14
#> 5     e     15# 使数据框随机化
data <- data[sample(1:nrow(data)), ]
data
#>   label number
#> 5     e     15
#> 2     b     12
#> 4     d     14
#> 3     c     13
#> 1     a     11

要使随机化可重复,应该为随机数生成器设置种子

Converting between vector types 向量类型转换

在数字向量、字符向量和因子之间进行转换

从这个数字向量 n 开始:

n <- 10:14
n
#> [1] 10 11 12 13 14

要将数字向量转换为其他两种类型:

# Numeric 数字型 to Character 字符型
c <- as.character(n)# Numeric 数字型 to Factor 因子型
f <- factor(n)
# 10 11 12 13 14

要将字符向量转换为其他两个:

# Character 字符型 to Numeric 数字型
as.numeric(c)
#> [1] 10 11 12 13 14# Character 字符型 to Factor 因子型
factor(c)
#> [1] 10 11 12 13 14
#> Levels: 10 11 12 13 14

将因子转换为字符向量很简单:

# Factor to Character
as.character(f)
#> [1] "10" "11" "12" "13" "14"

但把因子转为数值型则有点棘手
如果你只是用 as.numeric 转换它,它会给你给予因子的数字编码,这可能不是你想要的结果

as.numeric(f)
#> [1] 1 2 3 4 5# 另一种得到数字编码的方式
unclass(f)
#> [1] 1 2 3 4 5
#> attr(,"levels")
#> [1] "10" "11" "12" "13" "14"

将文本内容转换为数字的方法是:
首先将其转换为字符,然后转换为数字向量

# Factor to Numeric
as.numeric(as.character(f))
#> [1] 10 11 12 13 14

Finding and removing duplicate records 查找和删除重复记录

从向量或数据框中查找和/或删除重复条目

1、对向量

# 设置随机种子
# 生成一个向量,取整数部分
set.seed(158)
x <- round(rnorm(20, 10, 5))
x
#>  [1] 14 11  8  4 12  5 10 10  3  3 11  6  0 16  8 10  8  5  6  6# duplicate()判断是否有重复
# 某元素第一次出现的位置返回FALSE,第二次出现的位置返回TRUE
duplicated(x)
#>  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE
#> [15]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE# 利用返回的逻辑值取子集
x[duplicated(x)]
#> [1] 10  3 11  8 10  8  5  6  6
# 因为6、10、8出现了3次,后两次都是TRUE
# 所以会被选出来2个# 用unique()去重复
# unique()默认保留第一次出现的元素
unique(x[duplicated(x)])
#> [1] 10  3 11  8  5  6# 用unique()给原始x去重复
unique(x)
#>  [1] 14 11  8  4 12  5 10  3  6  0 16
# !逆转逻辑值
x[!duplicated(x)]
#>  [1] 14 11  8  4 12  5 10  3  6  0 16

2、对数据框

# 示例
df <- read.table(header=TRUE, text='label valueA     4B     3C     6B     3B     1A     2A     4A     4
')# 判断是否有重复的行?
duplicated(df)
#> [1] FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE# 找出重复的行
df[duplicated(df),]
#>   label value
#> 4     B     3
#> 7     A     4
#> 8     A     4# 重复条目去重
unique(df[duplicated(df),])
#>   label value
#> 4     B     3
#> 7     A     4# 原始数据去重复,返回去掉重复的数据框
unique(df)
#>   label value
#> 1     A     4
#> 2     B     3
#> 3     C     6
#> 5     B     1
#> 6     A     2
df[!duplicated(df),]
#>   label value
#> 1     A     4
#> 2     B     3
#> 3     C     6
#> 5     B     1
#> 6     A     2

Comparing vectors or factors with NA 将向量或因子与NA进行比较

想要比较两个向量或因子
但希望与 NA 比较的结果报告为 TRUEFALSE (而不是 NA

假如你有这样的数据框
由两列布尔向量(逻辑)组成,且内含 NA

df <- data.frame( a=c(TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,NA,NA,NA),b=c(TRUE,FALSE,NA,TRUE,FALSE,NA,TRUE,FALSE,NA))
df
#>       a     b
#> 1  TRUE  TRUE
#> 2  TRUE FALSE
#> 3  TRUE    NA
#> 4 FALSE  TRUE
#> 5 FALSE FALSE
#> 6 FALSE    NA
#> 7    NA  TRUE
#> 8    NA FALSE
#> 9    NA    NA

默认情况,当比较两个包含 NA 值的向量或因子时,
只要原始项中的任一项为 NA,结果向量将具有 NA

# 两列相比,相同返回TRUE
df$a == df$b
#> [1]  TRUE FALSE    NA FALSE  TRUE    NA    NA    NA    NA# 将结果新增一列到数据框中
data.frame(df, isSame = (df$a==df$b))
#>       a     b isSame
#> 1  TRUE  TRUE   TRUE
#> 2  TRUE FALSE  FALSE
#> 3  TRUE    NA     NA
#> 4 FALSE  TRUE  FALSE
#> 5 FALSE FALSE   TRUE
#> 6 FALSE    NA     NA
#> 7    NA  TRUE     NA
#> 8    NA FALSE     NA
#> 9    NA    NA     NA

NA 比较的函数:
这个函数本质上将 NA 视为另一个值。
如果两个向量中的一个项都是 NA ,则它报告该项的 TRUE ;
如果该项在一个向量中是 NA ,则它报告 FALSE ;
所有其他比较(非 NA 项之间)的行为相同。

# 只要内容相同就返回TRUE
compareNA <- function(v1,v2) {same <- (v1 == v2) | (is.na(v1) & is.na(v2))same[is.na(same)] <- FALSEreturn(same)
}

应用该函数比较布尔向量

compareNA(df$a, df$b)
#> [1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUEdata.frame(df, isSame = compareNA(df$a,df$b))
#>       a     b isSame
#> 1  TRUE  TRUE   TRUE
#> 2  TRUE FALSE  FALSE
#> 3  TRUE    NA  FALSE
#> 4 FALSE  TRUE  FALSE
#> 5 FALSE FALSE   TRUE
#> 6 FALSE    NA  FALSE
#> 7    NA  TRUE  FALSE
#> 8    NA FALSE  FALSE
#> 9    NA    NA   TRUE

应用该函数比较因子
即使因子的水平顺序不同

# 先创建两列因子
df1 <- data.frame(a = factor(c('x','x','x','y','y','y', NA, NA, NA)),b = factor(c('x','y', NA,'x','y', NA,'x','y', NA)))# 比较因子
data.frame(df1, isSame = compareNA(df1$a, df1$b))
#>      a    b isSame
#> 1    x    x   TRUE
#> 2    x    y  FALSE
#> 3    x <NA>  FALSE
#> 4    y    x  FALSE
#> 5    y    y   TRUE
#> 6    y <NA>  FALSE
#> 7 <NA>    x  FALSE
#> 8 <NA>    y  FALSE
#> 9 <NA> <NA>   TRUE# 即便因子顺序被改变,也不影响比较结果
df1$b <- factor(df1$b, levels=c('y','x'))
data.frame(df1, isSame = compareNA(df1$a, df1$b))
#>      a    b isSame
#> 1    x    x   TRUE
#> 2    x    y  FALSE
#> 3    x <NA>  FALSE
#> 4    y    x  FALSE
#> 5    y    y   TRUE
#> 6    y <NA>  FALSE
#> 7 <NA>    x  FALSE
#> 8 <NA>    y  FALSE
#> 9 <NA> <NA>   TRUE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker容器的使用与操作

1、什么是容器 镜像和容器的关系&#xff0c;就像是面向对象程序设计中的类和实例一样&#xff0c;镜像是静态的定义&#xff0c;容器是镜像运行时的实体&#xff0c;基于同一镜像可以创建若干个不同的容器。 每个容器都有一个软件镜像。可以将容器看作一个将应用程序及其依赖环…

使用vue3+ts+vite从零开始搭建bolg(二)

二、全局变量 2.1element-ui集成 pnpm i element-plus pnpm i element-plus element-plus/icons-vue main.ts配置文件 import ElementPlus from element-plus import element-plus/dist/index.css //ts-ignore import zhCn from element-plus/dist/locale/zh-cn.mjsapp.use…

浅说深度优先搜索(中)——回溯

写在最前 相信在你们不懈的努力之下&#xff0c;基本的递归一定可以写出来了&#xff0c;那么我们现在就来看看递归的升级版——回溯怎么写吧&#xff01; 简说回溯 递归是一种特别重要的解题策略。大部分题目需要找到最优解&#xff0c;而这个求解过程可能存在一定的规律性…

用单片机的矩阵键盘选择显示什么图像

注意行数据不能二进制 #include "reg51.h"typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8;//定义74HC595控制管脚 sbit SRCLKP3^6; //移位寄存器时钟输入 sbit RCLKP3^5; //存储寄存器时钟输入 sbit SERP3^4; //串行数据输入…

UE5(基础动作)多人游戏制作蹲伏

1.创建输入操作&#xff0c;IA_Crouch 在输入映射中添加 IA_Crouch,在触发器中创建两个索引&#xff0c;已按下已松开来创建蹲伏输入。 蹲伏操作必须要勾选角色-角色移动-crouch勾选可蹲伏否则你的人物无法真正蹲下。 为蹲伏创建函数&#xff0c;创建布尔来判断是否蹲伏。 通过…

CodeGemma初探

什么是 CodeGemma CodeGemma是一系列强大而轻量级的模型的集合&#xff0c;可以执行各种编码任务&#xff0c;包括填充中间代码补全、代码生成、自然语言理解、数学推理和指令跟随。 版本&#xff1a; instruct&#xff1a;7B, 这个版本专门针对自然语言到代码聊天和指令跟随…

day83 AJAX

1什么是AJAX AJAX语法 AJAX Asynchronous JavaScript and XML 异步js和XML 实现页面某一部份更新&#xff0c;无需服务器转发或重定向 1 $.ajax() 语法: $.ajax( { "url" : "url&qu…

数据库主从复制

一、主从复制概述 1、介绍&#xff1a; 主从复制是指将主数据库的 DDL 和 DML 操作写入到二进制日志中&#xff0c;将二进制日志传送到从库服务器&#xff0c;然后在从库上对这些日志重新执行&#xff08;重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 M…

百面算法工程师 | 分类网络总结

欢迎大家订阅我的专栏一起学习共同进步&#xff0c;主要针对25届应届毕业生 祝大家早日拿到offer&#xff01; lets go http://t.csdnimg.cn/dfcH3 目录 4. 经典分类网络与发展 4.1 AlexNet 4.2 VGGNet 4.3 GoogLeNet Inception 4.4 ResNet 4.5 DenseNet 4.6 MobileN…

C#中的浅拷贝(Shallow Copy)和深拷贝(Deep Copy),深拷贝的集中实现方式,浅拷贝深拷贝的案例

C#中的浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&#xff08;Deep Copy&#xff09; 拷贝就是创建一个对象&#xff0c;这个对象有着原始对象数据&#xff08;属性和字段&#xff09;的一份精确拷贝&#xff08;只针对Object和Array这样的引用数据类型&#xff09;…

mysql面试题七(集群)

目录 1.mySQL 中有哪些常见日志 错误日志&#xff08;Error Log&#xff09; 二进制日志&#xff08;Binary Log, Binlog&#xff09; 重做日志&#xff08;Redo Log&#xff09; 回滚日志&#xff08;Undo Log&#xff09; 慢查询日志&#xff08;Slow Query Log&#xf…

截断堆积柱状图

本教程原文链接&#xff1a;截断堆积柱状图绘制教程 欢迎大家转载&#xff01;&#xff01;&#xff01;&#xff01; 本期教程 写在前面 堆积柱状图是柱状图的常见类型之一&#xff0c;也是平时使用概率较高的图形之一。我们前期发布了很多个柱状图的绘制教程&#xff0c;若你…

java学习笔记4

7. 二维数组 7.1 定义 二维数组及就是数组的嵌套,数组的元素还是数组; 二维数组是一个 元素为一维数组 的一维数组; 语法上Java支持多维数组,但从内存分配原理的角度看,Java中只有一维数组,没有多维数组; 7.2 二维数组的初始化和赋值 7.2.1 长度已知 数据类型[][] 数…

【工厂模式】简单工厂模式-简单例子

目录 一、简单介绍 二、未使用工厂模式之前 三、简单工厂模式 初始 优化 总结 一、简单介绍 工厂模式是一种软件设计模式&#xff0c;用于创建对象的方法。在工厂模式中&#xff0c;创建对象的逻辑被封装在一个单独的类中&#xff0c;该类负责根据特定条件或参数创建合适…

windows下使用命令uvicorn启动fastapi程序有乱码,方框形状奇怪字符

问题简述 执行命令uvicorn main:app --reload后出现的问题如图所示 这个问题非常容易解决&#xff01; 原因是windows控制台 默认未开启 ANSI颜色的支持 那么我们只需要开启就可以了 轻松解决 1 按下winR 打开运行 2 输入regedit 点击确定编辑注册表 3 新建值 值的名称为…

探索PostCSS:打造定制化、前瞻性的现代CSS开发工作流

PostCSS&#xff0c;作为一个高度可扩展的CSS处理器&#xff0c;以其强大的插件系统和对CSS未来特性的前瞻支持&#xff0c;已经成为现代前端开发中的重要工具。本篇文章将深入探讨PostCSS的核心概念、工作原理、主要优势&#xff0c;以及如何利用它来提升CSS开发效率与代码质量…

vue3组件封装系列-表单请求

我们在开发一些后台管理系统时&#xff0c;总是会写很多的列表查询页面&#xff0c;如果不封装组件&#xff0c;就会无限的复制粘贴&#xff0c;而且页面很冗余&#xff0c;正常情况下&#xff0c;我们都是要把组件进行二次封装&#xff0c;来达到我们想要效果。这里我分享一下…

《中学科技》是什么级别的刊物?如何投稿?

《中学科技》是什么级别的刊物&#xff1f;如何投稿&#xff1f; 《中学科技》创刊于1976年&#xff0c;由上海世纪出版&#xff08;集团&#xff09;有限公司主管&#xff0c;上海科技教育出版社有限公司主办的省级学术期刊&#xff0c;《中学科技》以传播科技知识、启迪智慧…

Centos安装软件失败There are no enabled repos.

这个错出现的原因可能是&#xff1a;没有先安装wget源&#xff0c;就把源给备份了 解决方案&#xff1a; 下载对应版本repo文件, 放入/etc/yum.repos.d/里&#xff0c;下载地址&#xff1a;CentOS镜像使用帮助 查看自己CentOS的版本&#xff0c;下载对应的repo文件&#xff…

spring boot中的标注@Component、@Service等

让我告诉你什么叫水货。 一、水货横行 一直以来&#xff0c;我对Spring Boot项目中的标注&#xff0c;像Component啦、Service啦、Configuration啦&#xff0c;甚至Autowired啦&#xff0c;等等&#xff0c;都似懂非懂。Autowired与Resource有什么区别也不清楚。 个中原因&a…