R语言 数据的整理与清洗(Data Frame 篇下)

《Cookbook for R》 Manipulating Data ~ Dataframe

Comparing data frames 比较数据框

当你想比较两个或多个数据框,并从中找到:
1、重复出现在多个数据框中的行
2、或仅出现在一个数据框中的行

先构建三个示例数据框

dfA <- data.frame(Subject=c(1,1,2,2), Response=c("X","X","X","X"))
dfA
#>   Subject Response
#> 1       1        X
#> 2       1        X
#> 3       2        X
#> 4       2        XdfB <- data.frame(Subject=c(1,2,3), Response=c("X","Y","X"))
dfB
#>   Subject Response
#> 1       1        X
#> 2       2        Y
#> 3       3        XdfC <- data.frame(Subject=c(1,2,3), Response=c("Z","Y","Z"))
dfC
#>   Subject Response
#> 1       1        Z
#> 2       2        Y
#> 3       3        Z

要进行比较,首先将三个数据框与一列连接起来,该列标识每行来自哪个源数据框

dfA$Coder <- "A"
dfB$Coder <- "B"
dfC$Coder <- "C"df <- rbind(dfA, dfB, dfC)                    # 将三个数据框合并
# rbind 合并的前提是列名相同,按列将行依次粘起来
df <- df[,c("Coder", "Subject", "Response")]  # 重新排个序
df
#>    Coder Subject Response
#> 1      A       1        X
#> 2      A       1        X
#> 3      A       2        X
#> 4      A       2        X
#> 5      B       1        X
#> 6      B       2        Y
#> 7      B       3        X
#> 8      C       1        Z
#> 9      C       2        Y
#> 10     C       3        Z

查找重复的行:使用函数 dupsBetweenGroups()
可以找到哪些行在不同的组之间重复

dupRows <- dupsBetweenGroups(df, "Coder")# 将它单独列在数据框边上
cbind(df, dup=dupRows)
#>    Coder Subject Response   dup
#> 1      A       1        X  TRUE
#> 2      A       1        X  TRUE
#> 3      A       2        X FALSE
#> 4      A       2        X FALSE
#> 5      B       1        X  TRUE
#> 6      B       2        Y  TRUE
#> 7      B       3        X FALSE
#> 8      C       1        Z FALSE
#> 9      C       2        Y  TRUE
#> 10     C       3        Z FALSE
## 是没有保存的
## 要保存就赋值

Note:这样操作是不会显示组内重复的
例如:Coder=A,则有两行Subject=1Response=X,但它们未标记为重复

查找唯一的行

cbind(df, unique=!dupRows)
#>    Coder Subject Response unique
#> 1      A       1        X  FALSE
#> 2      A       1        X  FALSE
#> 3      A       2        X   TRUE
#> 4      A       2        X   TRUE
#> 5      B       1        X  FALSE
#> 6      B       2        Y  FALSE
#> 7      B       3        X   TRUE
#> 8      C       1        Z   TRUE
#> 9      C       2        Y  FALSE
#> 10     C       3        Z   TRUE

subset()拆分数据框:将原始的数据框分出来

# 将结果保存在df中
dfDup <- cbind(df, dup=dupRows)dfA <- subset(dfDup, Coder=="A", select=-Coder)
dfA
#>   Subject Response   dup
#> 1       1        X  TRUE
#> 2       1        X  TRUE
#> 3       2        X FALSE
#> 4       2        X FALSEdfB <- subset(dfDup, Coder=="B", select=-Coder)
dfB
#>   Subject Response   dup
#> 5       1        X  TRUE
#> 6       2        Y  TRUE
#> 7       3        X FALSEdfC <- subset(dfDup, Coder=="C", select=-Coder)
dfC
#>    Subject Response   dup
#> 8        1        Z FALSE
#> 9        2        Y  TRUE
#> 10       3        Z FALSE

忽略列:可以忽略一个或多个列
方法是从传递给函数的数据框中删除该列

# 忽略 Subject 这一列 
dfNoSub <- subset(df, select=-Subject)
dfNoSub
#>    Coder Response
#> 1      A        X
#> 2      A        X
#> 3      A        X
#> 4      A        X
#> 5      B        X
#> 6      B        Y
#> 7      B        X
#> 8      C        Z
#> 9      C        Y
#> 10     C        Z# 检查重复
dupRows <- dupsBetweenGroups(dfNoSub, "Coder")# 将结果合并进先前的数据框
cbind(df, dup=dupRows)
#>    Coder Subject Response   dup
#> 1      A       1        X  TRUE
#> 2      A       1        X  TRUE
#> 3      A       2        X  TRUE
#> 4      A       2        X  TRUE
#> 5      B       1        X  TRUE
#> 6      B       2        Y  TRUE
#> 7      B       3        X  TRUE
#> 8      C       1        Z FALSE
#> 9      C       2        Y  TRUE
#> 10     C       3        Z FALSE

扩充:dupsBetweenGroups()函数是如何写出来的

# 函数定义如下
dupsBetweenGroups <- function (df, idcol) {# df: 数据框# idcol: 用于确定每行所属的列# 获取用于查找匹配的列datacols <- setdiff(names(df), idcol)    # setdiff(x,y) 以x为标准,找出x、y的差集# idcol进行分类, 再按datacols分类. 保存排序,方便后面取消排序sortorder <- do.call(order, df) df <- df[sortorder,]# 先把重复的行找出来 (first copy is not marked)dupWithin <- duplicated(df) # 把每个组内的重复行去掉, 再在组间找重复行# 需要用duplicated()从上到下再从下到上扫描  because first copy is not marked.dupBetween = rep(NA, nrow(df))dupBetween[!dupWithin] <- duplicated(df[!dupWithin,datacols])dupBetween[!dupWithin] <- duplicated(df[!dupWithin,datacols], fromLast=TRUE) | dupBetween[!dupWithin]# ============= 用先前非NA值来替换NA值 ==============# 这就是为什么要提前分类 - 这使我们高效率地完成这部分工作# 获得非NA值的索引goodIdx <- !is.na(dupBetween)# 仅来自x的非NA值# 添加一个前导NA用于后续对该列向量进行索引goodVals <- c(NA, dupBetween[goodIdx])# 避免索引值为0fillIdx <- cumsum(goodIdx)+1# 原始向量, now with gaps filleddupBetween <- goodVals[fillIdx]# 撤销原来的排序dupBetween[sortorder] <- dupBetween# 返回各组中重复条目的向量return(dupBetween)
}
小扩充
(x <- c(sort(sample(1:20, 9)), NA))
# x  1  3  4  5  6 10 12 17 20 NA
(y <- c(sort(sample(3:23, 7)), NA))
# y  3  6  7  9 10 11 18 NA# 把x、y不重复的元素都放到一起
union(x, y)
#  [1]  1  3  4  5  6 10 12 17 20 NA  7  9 11 18# 把x、y取交集
intersect(x, y)
# [1]  3  6 10 NA# 以x为标准,把x、y的差集找到
setdiff(x, y)
# 1  4  5 12 17 20# 以y为标准,把y、x的差集找到
setdiff(y, x)
# [1]  7  9 11 18# 检查两个对象是否相等
setequal(x, y)
# [1] FALSE

Re-computing the levels of all factor columns in a data frame 数据框:重新计算因子列的level

有时候,在读入数据并对其进行清理后,会因子列中存在一些不该存在的level

示例数据
这里 d 有一个空白行,当它被读入时,因子列具有’ ’ ,这不应该是数据的一部分

d <- read.csv(header = TRUE, text='
x,y,value
a,one,1
,,5
b,two,4
c,three,10
')d
#>   x     y value
#> 1 a   one     1
#> 2             5
#> 3 b   two     4
#> 4 c three    10str(d)
#> 'data.frame':	4 obs. of  3 variables:
#>  $ x    : Factor w/ 4 levels "","a","b","c": 2 1 3 4
#>  $ y    : Factor w/ 4 levels "","one","three",..: 2 1 4 3
#>  $ value: int  1 5 4 10

即使删除了空行,因子仍然以空字符串 " " 作为一个等级

# 删去第二行
d <- d[-2,]
d
#>   x     y value
#> 1 a   one     1
#> 3 b   two     4
#> 4 c three    10str(d)
#> 'data.frame':	3 obs. of  3 variables:
#>  $ x    : Factor w/ 4 levels "","a","b","c": 2 3 4
#>  $ y    : Factor w/ 4 levels "","one","three",..: 2 4 3
#>  $ value: int  1 4 10

最简单的方法是使用 droplevels() 函数

d1 <- droplevels(d)
str(d1)
#> 'data.frame':	3 obs. of  3 variables:
#>  $ x    : Factor w/ 3 levels "a","b","c": 1 2 3
#>  $ y    : Factor w/ 3 levels "one","three",..: 1 3 2
#>  $ value: int  1 4 10

要重新计算所有因子列的水平,使用 vapply()is.factor() 来找出哪些列是因子
然后使用该信息和 lapply 循环将 factor() 函数应用于这些列。

# 找出哪些列是因子
factor_cols <- vapply(d, is.factor, logical(1))# 应用 factor() 函数到这些列, 然后赋值返回结果d
d[factor_cols] <- lapply(d[factor_cols], factor)
str(d)
#> 'data.frame':	3 obs. of  3 variables:
#>  $ x    : Factor w/ 3 levels "a","b","c": 1 2 3
#>  $ y    : Factor w/ 3 levels "one","three",..: 1 3 2
#>  $ value: int  1 4 10

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

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

相关文章

5g工业数采网关是什么?-天拓四方

随着工业4.0时代的到来&#xff0c;数字化、网络化、智能化成为工业发展的新趋势。在这个过程中&#xff0c;5G工业数采网关作为一种关键设备&#xff0c;发挥着越来越重要的作用。本文将详细解析5G工业数采网关是什么&#xff0c;以及它在工业领域中的应用和重要性。 一、5G工…

MySql CPU激增原因分析

QPS激增会导致CPU占用升高 分析 可以使用监控工具&#xff0c;查看CPU利用率曲线图和QPS曲线图进行对比。如果CPU曲线图波动情况跟QPS曲线图波动情况基本保持一致&#xff0c;可以明确明确CPU升高时QPS上升导致。反之&#xff0c;CPU曲线图对比QPS曲线图有不同步的峰值抖动&am…

socket套接字在tcp客户端与tcp服务器之间的通信,以及socket中常用的高效工具epoll

1.socket&#xff08;套接字&#xff09;的概念 Socket是对TCP/IP协议的封装&#xff0c;Socket本身并不是协议&#xff0c;而是一个调用接口&#xff08;API&#xff09;&#xff0c;通过Socket&#xff0c;我们才能使用TCP/IP协议,主要利用三元组【ip地址&#xff0c;协议&am…

【芯片科普】运算放大器用作比较器的注意事项

运算放大器和比较器 比较器和运算放大器电气符号非常相像&#xff0c;都是有反相、同相两个输入端和一个输出端的器件&#xff0c;输出端的输出电压范围一般在供电的轨到轨之间&#xff1b;同时比较器和运算放大器都具有低偏置电压、高增益和高共模抑制比的特点。 图1 运算放…

自由场、半自由场、扩散场

按声场性质可以将声场分为三类&#xff1a;自由声场、半自由声场、扩散声场 分别对应着全消声室&#xff0c;半消声室&#xff0c;混响室 自由声场&#xff1a; 声源在均匀、各向同性媒介中传播时&#xff0c;不计边界影响的声场&#xff0c;此时声场中只有直达声没有反射声。…

测试工程师面试准备(软硬件)

您好&#xff0c;我叫XXX。学历XX&#xff0c;XXX专业毕业。X年X月份毕业&#xff0c;但是去年二月份已经找到工作开始实习了&#xff0c;目前工作一年了&#xff0c;这一年的过程中我主要负责软件的开发和测试和软硬件联调测试工作。具体来说就是&#xff0c;在软件开发完成后…

在Linux系统中炫酷的输出命令可以让终端看起来更有趣

在Linux系统中,有许多炫酷的输出命令可以让终端看起来更有趣。 以下是一些流行的命令,以及它们的描述和安装方法: cmatrix:这个命令会在终端中显示一个类似于《黑客帝国》中的绿色代码雨效果。安装命令为`sudo apt-get install cmatrix`.sl:当你错误地输入`ls`为`sl`时,…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第八套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第八套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff09;获取&#xff08;WX:didadidadidida313&#xff0c…

Qwen1.5微调

引子 由于工作上需要&#xff0c;一直在用Qwen做大模型推理&#xff0c;有个再训练的需求&#xff0c;特此琢磨下Qwen的训练。OK&#xff0c;我们开始吧。 一、安装环境 查看显卡驱动版本 根据官网推荐 OK&#xff0c;docker在手&#xff0c;天下我有。 docker pull qwenll…

rancher-rke2 修改--service-cluster-ip-range

一、场景 因为需要部署新版本的ingress-nginx&#xff0c;而部署ingress-nginx的时候需要使用hostnetowrk以及nodeport的端口为80和443&#xff0c;service-node-port-range 默认为30000开始,部署会报错。 二、产生修改的需求 1、api-servier的配置文件位置 默认是没有的&…

LabVIEW学习记录 - 实时显示时间

LabVIEW操作 - 实时显示时间 在程序框图&#xff0c;选择函数->定时->格式化日期/时间字符串 该函数的使用手册说明&#xff1a; 鼠标选择“格式化日期/时间字符串”->创建->输入控件->输入格式 查看时间代码格式&#xff1a; 编程->定时->获取时间日…

Ali-Sentinel-入口控制

​ 归档 GitHub: Ali-Sentinel-入口控制 测试 // 在 demo-spring-webmvc 里新建测试类public class TestMain {public static void main(String[] args) throws InterruptedException {initFlowRules(); // 初始化规则while (true) {// 1.5.0 版本开始可以直接利用 try-with…

Stream流入门

Stream流:操作集合和数组的工具。 Stream的三类方法&#xff1a; 获取Stream流&#xff1a;创建一条流水线&#xff0c;并把数据放上去。中间方法&#xff1a;流水线上的操作&#xff0c;可以进行多次操作。终结方法&#xff1a;一个Stream流只能有一个终结方法&#xff0c;是…

Linux交换空间的创建使用

交换空间&#xff1a; 换出&#xff1a;将内存中不常用&#xff08;冷数据&#xff09;的放去硬盘里 换出&#xff1a;内存要使用这部分数据时&#xff0c;将硬盘的这部分数据放入内存 在内存和硬盘上用来交换数据的空间就是交换空间 创建交换空间的步骤 1.去磁盘上创建一个分…

想进大厂,请先想清楚这几个问题

今天被一个小伙伴问&#xff1a;“进大厂难吗&#xff1f;” 我想都不想回答&#xff1a;“简单啊~ 从北京郎家园&#xff0c;坐817或者816&#xff0c;终点站就是大厂。” 小伙伴翻了一个大大的白眼... “我是说工作上的事&#xff01;” 瞬间懂了&#xff0c;工作场所&…

C语言 | Leetcode C语言题解之第47题全排列II

题目&#xff1a; 题解&#xff1a; int* vis;void backtrack(int* nums, int numSize, int** ans, int* ansSize, int idx, int* perm) {if (idx numSize) {int* tmp malloc(sizeof(int) * numSize);memcpy(tmp, perm, sizeof(int) * numSize);ans[(*ansSize)] tmp;return…

OssUtil工具上传文件

安装、上传、下载 1. 安装ossutil sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash2. 配置ossutil ossutil config3. 验证是否已成功安装ossutil ossutil 如果屏幕中输出ossutil所有支持的命令&#xff0c;表明已成功安装ossutil。# 完整上传 os…

ruoyi-nbcio-plus基于vue3的flowable修正加签与跳转的前端问题

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

idea 中导入的项目maven不自动下载依赖包

导入之后不会自动引入依赖包&#xff0c;如下图&#xff0c;external libraries 下没有依赖 解决方案&#xff1a;重新更新下maven的Local repository 即可

MMSeg搭建自己的网络

配置结构 首先&#xff0c;我们知道MMSeg矿机的配置文件很多&#xff0c;主要结构如下图所示。 在configs/_base_下是模型配置、数据集配置、以及一些其他的常规配置和运行配置&#xff0c;四类。 configs/all_config目录下存放&#xff0c;即是将四种配置聚合在一起的一个总…