仅连接那些非 NA 的列

2024-02-28

我有一个数据集,某些列的某些行中包含 NA:

DT <- data.table(ID=c(1, 2, 1:3), A=c(NA, NA, 1, NA, 3), B=c(4, 5, NA, 5, 6), C=c(7, 8, NA, NA, 9))
DT
#    ID  A  B  C
# 1:  1 NA  4  7
# 2:  2 NA  5  8
# 3:  1  1 NA NA
# 4:  2 NA  5 NA
# 5:  3  3  6  9

以及参考表

ref <- data.table(ID=c(1, 1:3), A=c(1, 1:3), B=c(1, 4:6), C=c(1, 7, NA, 9), VAL=c(111, 101:103), VAL2=c(112, 104:106))
ref
#    ID A B  C VAL VAL2
# 1:  1 1 1  1 111  112
# 2:  1 1 4  7 101  104
# 3:  2 2 5 NA 102  105
# 4:  3 3 6  9 103  106

问:我如何离开加入DT with ref每行使用非 NA 列?

所需的输出(添加换行符以强调分组):

   ID  A  B  C VAL VAL2
1:  1 NA  4  7 101  104

2:  2 NA  5  8  NA   NA

3:  1  1 NA NA 111  112
4:  1  1 NA NA 101  104

5:  2 NA  5 NA 102  105

6:  3  3  6  9 103  106

我尝试按如下方式逐行执行此操作:

newcols <- c("VAL", "VAL2")
resLs <- lapply(split(DT, by="ID"), function(x) {
    #find those non-NA columns
    nonNACols <- names(x)[sapply(x, Negate(is.na))]

    #left join with ref table after subsetting the columns of ref table
    ref[, c(nonNACols, newcols), with=FALSE][x, on=nonNACols]
})

#combine the list of row results
ans <- rbindlist(resLs, use.names=TRUE, fill=TRUE)
setcolorder(ans, names(ref))
ans

如果解决方案可以通过某种组而不是逐行来完成,那就更好了。有什么建议么?


编辑:经过这么多小时终于解决了。通过分组使用 data.table:

cols <- c("ID","A", "B", "C")
newcols <- c("VAL", "VAL2")
DT[, grp := paste(names(.SD)[sapply(.SD, Negate(is.na))], collapse=""), by=seq_len(nrow(DT)), .SDcols=cols]

rbindlist(
    DT[, {
        vec <- names(.SD)[sapply(.SD, function(x) !all(is.na(x)))]
        list(list(ref[.SD, on=vec,
            c(vec, newcols), with=FALSE]))
    }, by=.(grp)]$V1,
    use.names=TRUE, fill=TRUE)

编辑:另一种编码方式

cols <- c("ID","A", "B", "C")
newcols <- c("VAL", "VAL2")
DT[, grp := paste(names(.SD)[sapply(.SD, Negate(is.na))], collapse="_"),
    by=seq_len(nrow(DT)),
    .SDcols=cols]

setnames(DT[,
    ref[.SD, on=strsplit(.BY$grp, split="_")[[1L]], 
        c(paste0("i.", cols), paste0("x.",newcols)), with=FALSE], 
    by=.(grp)][,-1L], 
    c(cols, newcols))[]

一种选择是匹配类似的东西A = A OR is.na(A)等等。但是,我认为你不能使用OR合并条件data.tables。对于像这样复杂的合并情况,我喜欢使用sqldf反而:

library(sqldf)
sqldf("SELECT l.*, r.VAL, r.VAL2
       FROM       DT as l
       LEFT JOIN  ref as r
       ON         l.ID = r.ID AND (l.A = r.A OR l.A IS NULL)
                  AND (l.B = r.B OR l.B IS NULL)
                  AND (l.C = r.C OR l.C IS NULL)
                  AND (l.A IS NOT NULL OR l.B IS NOT NULL OR l.C IS NOT NULL)")

#  ID  A  B  C VAL VAL2
#1  1 NA  4  7 101  104
#2  2 NA  5  8  NA   NA
#3  1  1 NA NA 111  112
#4  1  1 NA NA 101  104
#5  2 NA  5 NA 102  105
#6  3  3  6  9 103  106

请注意,最后一个条件确保如果您的所有A, B, C are NA那么它不会匹配任何行。

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

仅连接那些非 NA 的列 的相关文章

  • 带频率图的 R 热图类型图

    I am trying to create a plot like the following 我已经使用 ggplot2 中的 geom tile 粗略地得到了左侧图 但我无法弄清楚如何生成右侧图以及如何将两个图放在一起 Example
  • 通过非 sf 列内连接两个 sf 对象

    我尝试使用内连接或左连接连接两个 sf 数据帧 这些数据框内部都有几何列 我不断收到错误 check join x y 中的错误 y 应该是一个数据框 对于空间连接 请使用 st joinFALSE 下面的可重现示例 df1 lt data
  • R2WinBUGS - 使用模拟数据进行逻辑回归

    我只是想知道是否有人有一些使用 R2WinBUGS 包来运行逻辑回归的 R 代码 理想情况下使用模拟数据来生成 真相 和两个连续协变量 Thanks 基督教 PS 生成人工数据 一维情况 并通过 r2winbugs 运行 winbugs 的
  • rvest open.connection(x, "rb") 中出现错误:已达到超时

    我正在尝试从中抓取内容http google com http google com 错误信息就出来了 library rvest html http google com open connection x rb 中的错误 已达到超时另外
  • 错误:“tidyverse”的包或命名空间加载失败:“namespace:dplyr”未导出对象“relocate”

    我使用以下命令安装了 tidyverse install packages tidyverse 但是安装后 当我使用以下命令调用库时 library tidyverse 我收到此错误 Error package or namespace l
  • 如何在 R 中执行随机森林/交叉验证

    我无法找到对我尝试生成的回归随机森林模型执行交叉验证的方法 因此 我有一个数据集 其中包含 1664 个解释变量 不同的化学性质 和一个响应变量 保留时间 我正在尝试生成一个回归随机森林模型 以便能够预测给定保留时间的物质的化学性质 ID
  • R 中多类分类的 ROC 曲线

    我有一个包含 6 个类别的数据集 我想绘制多类别分类的 ROC 曲线 Achim Zeileis 给出的第一个答案非常好 R中使用rpart包的ROC曲线 https stackoverflow com questions 30818188
  • 在闪亮的应用程序和多个页面中进行身份验证

    在我正在开发的系统中 我有 3 个不同的参与者 用户 管理员 支持团队 使用 Shiny App 我想知道如何向这三个参与者进行身份验证 每个参与者只能访问他们的页面 我发现使用闪亮的服务器专业版可以实现这一点 但它不是免费的 有什么方法可
  • dplyr :过滤一系列行(在一列中)

    虚拟数据框 id family lt c 1 1 2 2 3 3 people lt c male female male female male children dataset lt data frame id family peopl
  • 当按多列分组时,如何命名 dplyr 中的 group_split 列表

    我在 dplyr 中使用 group split 在分割了多个列后 我很难命名列表 当我们按一列分组时 我知道该怎么做here https stackoverflow com questions 57107721 how to name t
  • 使用 gbuffer 在 R 中缓冲(地理)空间点

    我正在尝试缓冲数据集中半径为 100 公里的点 我正在使用该功能gBuffer从包装中rgeos 这是我到目前为止所拥有的 head sampledf postalcode lat lon city province 1 A0A0A0 47
  • 如何处理重叠的因子水平? (例如,生成表格和图表时)

    我面临一个数据集的问题重叠因素水平 我想按因素级别生成时间线 条形图和统计数据 但是 我希望因子水平是模棱两可的 这意味着属于多个级别的观察结果应该在图中出现多次 这是我的数据结构的示例 head lt c ID YEAR BRAZIL G
  • 使用facet时ggplot2控制每行的面板数量?

    Is it possible to control the number of panels per row in a ggplot I can only get an equal number of panels on each row
  • 为 RStudio Server 1.0.44 配置日志目录

    我在 CentOS 7 上运行 RStudio Server 1 0 44 根据文档 https support rstudio com hc en us articles 200554766 RStudio Server Applicat
  • 完全缺失列的 VaR 计算

    我需要计算股票收益的滚动 VaR 从这篇文章 使用rollapply函数使用R进行VaR计算 https stackoverflow com questions 25045612 using rollapply function for v
  • 从大型 DataTable 列中选择不同的值

    我有一个包含 22 列的 DataTable 其中一列称为 id 我想查询此列并将所有不同的值保留在列表中 该表可以包含 10 到 100 万行 做到这一点的最佳方法是什么 目前 我正在使用 for 循环遍历列并比较值 如果值相同 则转到下
  • 网页抓取(R 语言?)

    我想获取中间栏中的公司名称this http www consumercomplaints in bysubcategory mobile service providers page 1 html页面 以蓝色粗体书写 以及登记投诉者的位置
  • 如何从类外部更改公共 R6 类方法?

    我希望能够在我的 R6 类中重新定义公共方法 以便它根据该类保存的数据类型进行更改 如下所示 library R6 Simple lt R6Class Simple public list dt mtcars my print functi
  • R markdown 引文标识符

    R markdown 允许使用 YAML 元数据部分中的参考书目元数据字段指定参考书目文件 例如 title Sample Document output html document bibliography bibliography bi
  • 为 ggplot 定义新的尺度轴变换

    我正在尝试创建一个squared使用 y 轴变换scales trans new但遇到错误 MWE data data frame x 1 10 y runif 10 z rnorm 10 10 library ggplot2 ggplot

随机推荐

  • 查找并替换以模式开头的行

    我在文件 file txt 中有这样的文本 xxxxxxxxxxxxxxx xxxxxxxxxxxxxxx a b c delimited by tab xxxxxxxxxxxxxxx xxxxxxxxxxxxxxx 我知道使用sed我可以
  • Rake 预览在 Octopress 中不起作用

    我的机器上安装了 ruby 版本 1 9 3 并为我的个人网站开发 octopress 项目 我对 gems 使用了 rvm 并遵循 octopress org 记录的所有步骤 但我在我的 rake 服务器中发现了一些错误 这是我的命令日志
  • 如何在objective-c中获取macos登录用户名

    请让我知道如何在 Objective C 中获取当前登录的用户名或 mac 机器名 如果可能 谢谢 There s NS用户名 http developer apple com mac library documentation cocoa
  • Spinner 不会响应点击...即使 onItemSelected 被调用?

    我的 Activity 为微调器实现了 OnItemSelected 侦听器 它有一个有趣的问题 即当活动显示时触发 onItemSelected 回调 所以我使用了一个flag hack来解决它 我讨厌它 但此时我只想让应用程序工作 奇怪
  • 为什么“libpq”使用轮询而不是通知来获取数据?

    我在读libpq参考 它有同步和异步两种方法 但是我发现了一些奇怪的事情 当我看见PQsendQuery函数 它似乎发送一个查询并立即返回 我希望有一个回调函数得到通知 但没有这样的事情 手册上说poll以保证数据的可用性 我不明白为什么异
  • Github API v3 不显示所有用户存储库

    如果我输入这个命令 curl https api github com users KiCad repos grep full name 我预计它将返回所有 KiCad 存储库 但它返回 full name KiCad Air Coils
  • Node.js 多行输入

    我想提示用户输入 让用户输入多行文本 在每行之间按 Enter 键 然后按 CTRL D 或类似的东西终止输入 使用 按键 我可以捕获 EOF 但我必须手动处理所有回显 退格处理 终端转义序列等 如果我可以使用 readline 但以某种方
  • 从命令行运行 python 脚本时 import 语句不起作用

    我需要从命令行运行 python 脚本 OS Debian wheezy python version 3 5 我使用 PyCharm 社区版 编写脚本 它在 IDE 内部运行 I used sys path append命令添加包含我想要
  • 基于最小/最大值的 Numpy 动态数组切片

    我有一个 3 维 hape 数组 365 x y 其中 36 对应 每日数据 在某些情况下 沿时间轴的所有元素axis 0 are np nan 沿线每个点的时间序列axis 0看起来像这样 我需要找到最大值 峰值数据 出现的索引 然后找到
  • Angular 2:找不到 NgModule 元数据

    我是 Angular 2 的新手 并尝试按照我找到的视频教程进行操作 尽管遵循了所有步骤 Angular 还是无法工作 我收到以下错误 compiler umd js 13854 Uncaught Error No NgModule met
  • 锁定 Android 上的 CPU 以进行应用程序性能测试

    我正在尝试测试应用程序在不同 CPU 状态下在 Android 上的性能 所以我想将 CPU 锁定在 1000Mhz 并读取读数 然后使 CPU 过载并读取读数 我的问题是 是否有办法以一定的锁定 冻结速率锁定 CPU 和可能的 RAM 任
  • 使用 Anaconda 在 OSX 上安装 GalSim 时遇到问题

    我一直在尝试在 OSX 10 9 Mavericks 上安装 GalSim 并安装了 Anaconda 并将其设置为默认 python 但遇到了以下错误 Unable to build a python loadable module us
  • 如何启动一个不是 Go 中文件的进程(例如打开网页)

    我想打开一个网络浏览器 c err exec Command http localhost 4001 Output if err nil fmt Printf ERROR v v n err c else fmt Printf OK v n
  • Ansible:如何启动已停止的服务?

    我创建了一个使用的剧本ansible facts services重新启动多个 RHEL 服务器上的特定服务 重新启动的服务以特定名称开头 并且可能存在于运行 playbook 的不同主机上 也可能不存在 我的工作正常 但我还想添加一个后续
  • 无法识别“位置”的类型。它将被视为字符串

    我正在尝试使用宝石activerecord postgis adapter当我尝试执行此代码时 require active record require pg require active record postgis adapter c
  • 我应该在onCreate还是onRestoreInstanceState中恢复savedinstancestate?

    我有一个活动启动其他一些活动以获取结果 因此当结果返回时 该活动可能已被销毁并重新创建 也可能没有 我重写了 onSaveInstanceState 以添加需要保存和恢复的数据 当 Activity 被销毁并重新创建时 onCreate 会
  • 在构造函数中初始化列表

    我需要创建一个类 该类还将两个事件列表初始化为新的空列表 我不确定这是否是对我的要求 但我知道如何创建列表以及如何创建构造函数 我创建了 2 个列表 现在我应该创建构造函数 这是我的清单之一 List
  • Android - 键盘消失时仍保留空白

    我的键盘有问题 当它消失时 它所占据的空间仍然是空白 其余布局不会调整 正常屏幕 带键盘 键盘已关闭 我以前从未见过这个 所以我什至不知道从哪里开始寻找 4 2 2 和 5 1 上都会发生这种情况 另一条重要信息是 这是一个包含所有内容的自
  • 每 n 个位置将列表中的项目插入到另一个列表

    我有以下清单 vector 1 2 3 4 5 6 7 8 9 10 inserted elements 2 2 2 2 2 我想通过插入每两个元素来得到以下结果 output 1 2 2 3 4 2 5 6 2 7 8 2 9 10 2
  • 仅连接那些非 NA 的列

    我有一个数据集 某些列的某些行中包含 NA DT lt data table ID c 1 2 1 3 A c NA NA 1 NA 3 B c 4 5 NA 5 6 C c 7 8 NA NA 9 DT ID A B C 1 1 NA 4