选择一个数据框中与另一数据框中部分匹配的行

2023-12-19

我希望在一个数据框中选择行,data.1,部分匹配第二个数据帧中的行,keep.these,得到desired.result。我在这里发现了几个基于一列匹配的问题,但我想在三列上匹配:STATE, COUNTY and CITY。到目前为止,我已经提出了三种解决方案,但似乎没有一个是理想的。

请注意,每一行都包含一个唯一的组合STATE, COUNTY and CITY在我的真实数据中。

当我使用merge我必须重新order。功能match似乎可行,但我对它不熟悉,不知道我对这个功能的使用是否符合预期。这apply下面的解决方案显然太复杂了。

The merge如果我不必对结果重新排序,这种方法将是理想的。对于大型数据集,重新排序可能非常耗时。这match如果有人可以确认这是一个合理的方法,那么该方法似乎还可以。

有没有更好的解决方案,最好是在基地R?

data.1 <- read.table(text= "
     CITY     COUNTY   STATE        AA
       1          1         1        2
       2          1         1        4
       1          2         1        6
       2          2         1        8
       1          1         2       20
       2          1         2       40
       1          2         2       60
       2          2         2       80
       1          1         3      200
       2          1         3      400
       1          2         3      600
       2          2         3      800
       1          1         4     2000
       2          1         4     4000
       1          2         4     6000
       2          2         4     8000
       1          1         5    20000
       2          1         5    40000
       1          2         5    60000
       2          2         5    80000
", header=TRUE, na.strings=NA)

keep.these <- read.table(text= "
     CITY     COUNTY     STATE      BB
       1          1         2      -10
       2          1         2      -11
       1          2         2      -12
       2          2         2      -13
       1          1         4      -14
       2          1         4      -15
       1          2         4      -16
       2          2         4      -17
", header=TRUE, na.strings=NA)

desired.result <- read.table(text= "
     CITY     COUNTY    STATE       AA
       1          1         2       20
       2          1         2       40
       1          2         2       60
       2          2         2       80
       1          1         4     2000
       2          1         4     4000
       1          2         4     6000
       2          2         4     8000
", header=TRUE, na.strings=NA)

##########

# this works, but I need to reorder

new.data.a <- merge(keep.these[,1:3], data.1, by=c('CITY', 'COUNTY', 'STATE'))

new.data.a <- new.data.a[order(new.data.a$STATE, new.data.a$COUNTY, new.data.a$CITY),]

rownames(desired.result) <- NULL
rownames(new.data.a)     <- NULL

all.equal(desired.result, new.data.a)

##########

# this seems to work, but match is unfamiliar

new.data.2 <- data.1[match(data.1$CITY  , keep.these$CITY  , nomatch=0) & 
                     match(data.1$STATE , keep.these$STATE , nomatch=0) & 
                     match(data.1$COUNTY, keep.these$COUNTY, nomatch=0),]

rownames(desired.result) <- NULL
rownames(new.data.2)     <- NULL

all.equal(desired.result, new.data.2)

##########

# this works, but is too complex

data.1b      <- data.frame(my.group = apply(    data.1[,1:3], 1, paste, collapse = "."),     data.1)
keep.these.b <- data.frame(my.group = apply(keep.these[,1:3], 1, paste, collapse = "."), keep.these)

data.1b <- data.1b[apply(data.1b, 1, function(x) {x[1] %in% keep.these.b$my.group}),]
data.1b <- data.1b[,-1]

rownames(desired.result) <- NULL
rownames(data.1b)        <- NULL

all.equal(desired.result, data.1b)

##########

这是此类问题的通用解决方案,非常有效:

data.1.ID <- paste(data.1[,1],data.1[,2],data.1[,3])

keep.these.ID <- paste(keep.these[,1],keep.these[,2],keep.these[,3])

desired.result <- data.1[data.1.ID %in% keep.these.ID,]

我只是为每条记录创建了一个唯一的 ID,然后对其进行搜索。 注意:这将更改行名称,您可能需要添加以下内容:

row.names(desired.result) <- 1:nrow(desired.result)

EDIT:

这是解决同一问题的另一种方法。

如果您有一个非常大的数据集,例如数百万行,另一个非常有效的解决方案是使用该包data.table。它的工作速度比merge,取决于您拥有多少数据。

您所要做的就是以下几点:

library(data.table)

第一步:转换data.frame to data.table,前三列作为键。

d1 <- data.table(data.1, key=names(data.1)[1:3])
kt <- data.table(keep.these, key=names(keep.these)[1:3])

Step2:使用合并data.table的二分查找:

d1[kt]

注1:执行的简单性。 注2:这将按键对数据进行排序。为了避免这种情况,请尝试以下操作:

data.1$index <- 1:nrow(data.1)  # Add index to original data
d1 <- data.table(data.1,key=names(data.1)[1:3]) # Step1 as above
kt <- data.table(keep.these,key=names(keep.these)[1:3])  # Step1 as above
d1[kt][order(index)]  # Step2 as above

如果您想删除最后两列(index, BB),这也很简单:

d1[kt][order(index)][,-(5:6),with=F] #Remove index

尝试使用大数据集,并将时间与merge。通常速度要快 50-100 倍左右。

要了解更多信息data.table, try:

vignette("datatable-intro")
vignette("datatable-faq")
vignette("datatable-timings")

或者看看它的实际效果:

example(data.table)

希望这可以帮助!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

选择一个数据框中与另一数据框中部分匹配的行 的相关文章

随机推荐

  • 在 Windows 10 Professional 中安装自定义 inf 时遇到问题。 Windows 使用 OEM 驱动程序覆盖它

    我已经为自定义设备制作了签名的 USB 串行 inf 文件 并创建了一个安装程序 该安装程序成功地将驱动程序安装到 Windows 7 32 64 Windows 8 1 64 但不适用于 Windows 10 这适用于默认安装 右 使用设
  • 使用 Swiftui 我们如何创建用户表单

    我想创建一个表单 其中所有文本字段都需要从相同的对齐方式开始 如下图所示 它不从相同的对齐方式开始 名字 姓氏和电话号码所有文本字段未在单个垂直线上正确对齐 VStack HStack Text First Name TextField F
  • 更新 ATOM 条目的正确/可接受的方法

    什么是 正确 的方式来指示 ATOM 提要中的条目已更新 正确 是指符合现有规范and读者会注意到某些内容并将其标记为新的 未读的 我发现的所有规范都表明支持更新的节点 但是 当我尝试这样的事情时
  • Django 视图中长时间、缓慢的操作会导致超时。有什么办法可以让 Python 代替 AJAX 说话吗?

    我从事 Python 编程已经有一段时间了 但 DJango 和 Web 编程对我来说总体来说还是陌生的 我在 Python 视图中执行了一个很长的操作 由于我认为 local 函数需要很长时间才能返回 因此存在 HTTP 超时 公平地说
  • 并发原子选择更新

    我怎样才能使用 sqlalchemy 做这样的事情 user session query select from user if user state active session query update user set state i
  • 在 C# 中交换 32 位正整数中的位

    所以我正在尝试解决这个问题 给定一个随机的 32 位正整数 你要做的就是将第 3 4 5 位的值与第 24 25 26 位的位值交换 假设这是一个您不需要明确解决方案的问题 这里有一个提示 使用以下命令屏蔽有问题的位 做一个转变 然后OR然
  • 调用chrome.tabs.query后,得不到结果

    我正在创建 学习 Google Chrome 的扩展程序 为了调试一些代码 我插入了console log 如下 var fourmTabs new Array chrome tabs query function tabs for var
  • Javascript随机化数组,而起始位置没有元素[重复]

    这个问题在这里已经有答案了 我有一个 JavaScript 问题 我让用户输入一个名称列表 然后将其放入一个数组中 长话短说 我正在编写一种随机方法 让人们弄清楚他们将为谁购买圣诞礼物 例如 原始数组由以下名称组成 Alex Joel Li
  • 合并具有相同键的元组

    如何合并具有相同键的元组 list 1 AAA 123 AAA 456 AAW 147 AAW 124 并将它们变成 list 2 AAA 123 456 AAW 147 124 最有效的方法是使用collections defaultdi
  • Django中的send_mail,在shell中工作,在本地工作,不在视图中

    我什至不知道如何调试这个 我在 Django 的一个视图中使用 send mail 在本地使用该应用程序时 使用与我在生产中使用的相同的 SMTP 设置 它可以正常工作 并且在生产中的 shell 中也可以正常工作 同样 使用相同的设置 但
  • 当标题拆分为两行时修复plotly ggplotly() 标题重叠图

    在下面的示例中 标题的第二行与情节略有重叠 有没有办法通过增加标题和情节之间的间距来解决这个问题 library ggplot2 library plotly library magrittr p1 lt ggplot iris aes x
  • 如何使用 $.ajax(jQuery 或 Zepto)发布对象数组

    我想在 Zepto 或 Jquery 中使用 ajax 发布一组对象 两者都表现出相同的奇怪错误 但我找不到我做错了什么 当使用像 RestEasy 这样的测试客户端发送数据时 数据会保存到服务器 并且我可以看到请求在浏览器的网络面板中被破
  • 使用 Tor 运行 Puppeteer

    我安装了 Tor Expert Bundle 并且想使用 Puppeteer 运行它 I try const browser await puppeteer launch headless false args proxy server s
  • 更新后 Fabric 崩溃:[Fabric isCrashlyticsCollectionEnabled]:无法识别的选择器发送到类 0x10c0bb918

    今天 pod 更新后 Fabric 崩溃了 面料1 9 0 Fabric isCrashlyticsCollectionEnabled unrecognized selector sent to class 0x10c0bb918 崩溃线
  • Linux系统调用

    我能够获得系统调用的执行及其在内核中的处理 但我还不清楚一些事情 进入 swi 例程后 内核保存 用户模式寄存器在堆栈上 问题是 是谁的堆栈 因为 swi 处理和相应的系统调用例程需要堆栈帧来工作 如果是内核自己的堆栈 那么从哪里分配堆栈
  • 为什么数据流步骤无法启动?

    我有一个线性三步数据流管道 由于某种原因 最后一步开始 但前面的两个步骤挂起Not started在我放弃并终止这份工作之前很长一段时间 我不确定是什么导致了这个问题 因为同样的管道过去曾成功运行过 而且我很惊讶它没有在日志中显示任何阻止前
  • 更改成员资格连接字符串

    我是 ASP NET 成员资格新手 我需要帮助以编程方式更改其连接字符串 到目前为止我尝试过的是 我创建了一个类项目名称 Sample 作为命名空间 并扩展了System Web Security SqlMembershipProvider
  • C++中接口类和实现类的并行继承

    我正在尝试以与 Java 接口类似的方式使用 C 抽象基类 假设我们有以下仅具有纯虚函数的接口类 class Shape virtual double area 0 class Square public Shape virtual voi
  • 最简单的反向代理[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在寻找一种方法来简单地在本地设置连接到远程站点的代理 我不想在系统中正确安装任何东西 如果我可以使用单个命令行调用来调用它 而不是使用单个配置文件
  • 选择一个数据框中与另一数据框中部分匹配的行

    我希望在一个数据框中选择行 data 1 部分匹配第二个数据帧中的行 keep these 得到desired result 我在这里发现了几个基于一列匹配的问题 但我想在三列上匹配 STATE COUNTY and CITY 到目前为止