R:如何使 data.table 只读而不复制它(例如用于数据验证)

2024-03-22

我进行数据整理(ETL)以将新数据加载到数据库中,并希望让用户基于我现有的实现自己的数据验证功能data.table包含准备好的数据的对象。

如何避免用户可以更改(修改)我的数据data.table在验证函数中(有意或无意)而不进行复制(因为它会减慢验证处理速度,从而减慢整个 ETL 过程)?

仅在验证功能中暂时需要锁定/写保护数据...

简化示例:

library(data.table)

DT <- as.data.table(mtcars)
DT[, row.number := 1:(.N)]  # add a row number column to allow identification of invalid rows
DT[c(3,6,7), cyl := 100]    # create some data errors (100 cylinders in the car)

# correctly implemented validate function (does not change the data)
validate <- function(data) {
  data[cyl > 10, .(row.number = row.number, col.name = "cyl", col.value = cyl,
                   severity = "ERROR", msg = "More than 10 cylinders")]
}

validate(DT)

输出正常并且data.table传递给validate()功能没有改变:

   row.number col.name col.value severity                    msg
1:          3      cyl       100    ERROR More than 10 cylinders
2:          6      cyl       100    ERROR More than 10 cylinders
3:          7      cyl       100    ERROR More than 10 cylinders

我想避免的是用户实现validate()像这样并修改原始数据:

validate.with.side.effects <- function(data) {
  data[, max.cyl := 10]  # this adds a new column into the original data.table!
  data[cyl > max.cyl, .(row.number = row.number, col.name = "cyl", col.value = cyl, severity = "ERROR", msg = "More than 10 cylinders")]
}

这个实现会修改原始的data.tableDT!

Update:

有一个开放的功能请求:https://github.com/Rdatatable/data.table/issues/1086 https://github.com/Rdatatable/data.table/issues/1086

该功能请求基于不同上下文中的类似需求(包中的不可变数据):锁定或保护 R 中的 data.table https://stackoverflow.com/q/29085334/4468078

Update 2

还有另一个类似的功能请求:https://github.com/Rdatatable/data.table/issues/778 https://github.com/Rdatatable/data.table/issues/778

还有另一个类似的问题:如何从 R 函数返回“const”data.table? https://stackoverflow.com/q/25426810/4468078

更新3:可以使用不可变的 data.frame 吗?

一般来说是的(制作一个data.frame只读)但是这个解决方案不满足问题的要求:

library(plyr)
idf <- idata.frame(DT)
idf[, max.cly := 10]
# Error in `:=`(max.cly, 10) :
#  Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").

validate(idf)
# Error in `[.idf`(data, cyl > 10, .(row.number = row.number, col.name = "cyl",  :
#                                     object 'cyl' not found

# it is no longer a data.table...
class(idata.frame(DT))
# [1] "idf"         "environment"

# so that the data.table syntax does NOT work anymore...
idf[cyl > 10, .(row.number = row.number, col.name = "cyl", col.value = cyl,
                severity = "ERROR", msg = "More than 10 cylinders")]
# Error in `[.idf`(idf, cyl > 10, .(row.number = row.number, col.name = "cyl",  :
#                                    object 'cyl' not found

会一个不可变数据框 https://github.com/genome-vendor/r-cran-plyr/blob/master/R/immutable.r允许你完成你需要的事情吗?

R 的对象通常是不可变的,并采用使用时复制语义来应用函数(请参阅这个链接 http://www.win-vector.com/blog/2015/03/using-closures-as-objects-in-r/更多细节)。 data.table 有点奇怪,因为它允许与对象直接交互,绕过使用时复制,这使得它更像是一个可变对象。您所描述的场景需要一个具有可变和不可变属性的对象。您可能必须复制 dt 才能应用验证而不修改原始对象。

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

R:如何使 data.table 只读而不复制它(例如用于数据验证) 的相关文章

  • 闪亮的如何阻止用户访问选项卡?

    我需要阻止用户访问其他选项卡 直到完成某些操作 在这个可重现的示例中 我想阻止用户访问Tab 2直到他按下按钮 该应用程序如下所示 这是该应用程序的代码 library shiny ui lt shinyUI navbarPage tabP
  • 通过非 sf 列内连接两个 sf 对象

    我尝试使用内连接或左连接连接两个 sf 数据帧 这些数据框内部都有几何列 我不断收到错误 check join x y 中的错误 y 应该是一个数据框 对于空间连接 请使用 st joinFALSE 下面的可重现示例 df1 lt data
  • R 中第三维的平均值

    R中是否有任何快速方法或内置函数来计算基于第三维的平均值 例如我的数组是 1 1 2 1 1 3 2 2 4 2 1 2 1 11 13 2 12 14 3 1 2 1 21 23 2 22 24 我的输出是 1 2 1 mean 1 11
  • Leaflet Map - 第二个多边形使第一层不可点击

    我正在制作美国社区调查数据地图 目前我有一个主要层 如下所示plotMerge incomePerCapita 它运作良好 有一个完全充实的弹出窗口 图像等等 当我添加第二层以提供县和地区边界时 区域边界变得不可单击 似乎被新层掩盖了 如果
  • 数据表、计算列

    我正在尝试使用 DataTable 插件在表中创建一列 该列是使用前两列的值计算的 像这样的东西 价格 数量 总计 Price QTY Total 5 2 10 10 3 30 4 1 4 我觉得它应该很简单 但我无法让它发挥作用 这是我试
  • 列表列中的设置操作

    我正在尝试做集合运算在存储在列表列中的向量之间 例如this https stackoverflow com questions 38712196 text file to dataframe with a list column DT l
  • 如何找到每个分类变量的连续变量的平均值

    我想在 y 轴上绘制连续的 BMI 在 x 轴上绘制家庭收入的分类变量 并且我希望该图绘制每个类别的平均 BMI 然而 我不知道如何找到家庭收入每个因素的平均体重指数 Dataset nh 5994 total IDs with Obser
  • R 中的优化函数可以接受目标、梯度和粗麻布吗?

    我有一个想要优化的复杂目标函数 优化问题需要相当长的时间来优化 幸运的是 我确实有可用的函数的梯度和粗麻布 R 中是否有一个优化包可以接受所有这三个输入 optim 类不接受 Hessian 矩阵 我已经扫描了用于优化的 CRAN 任务页面
  • 与 data.table 合并时防止重复列

    我有两个数据表 它们的列名部分相似 dfA lt read table text A B C D E F G iso year matchcode 1 0 1 1 1 0 1 0 NLD 2010 NLD2010 2 1 0 0 0 1 0
  • 尝试通过列表递归时,在 R 中出现错误“递归索引在级别 2 失败”

    当我尝试递归遍历图形顶点列表 将它们的值与列表中的一组颜色进行匹配时 出现错误 递归索引在级别 2 失败 我的颜色列表如下 colrs lt list l blue c red n gray50 然后我有一个 igraph 中的顶点列表vs
  • 添加有关白天/黄昏/夜晚/黎明的信息以在 R 中跟踪数据

    我有一个数据集 其中包含几个月的日期时间 纬度和经度变量的跟踪数据 如下所示 gt start lt as POSIXct 2018 08 01 00 00 00 format Y m d H M S tz UTC gt datetime
  • 更改 ggplot 条形图填充颜色

    有了这个数据 df lt data frame value c 20 50 90 group c 1 2 3 我可以得到一个条形图 df gt ggplot aes x group y value fill value geom col c
  • 使用 ggplot_build 和 ggplot_gtable 后使用 ggsave 保存图形

    我正在通过更改 ggplot build 生成的数据来修改使用 ggplot 构建的图表 原因类似于包括 geom boxplot 中填充美学中使用的缺失因子水平的空间 https stackoverflow com questions 1
  • 为 RStudio Server 1.0.44 配置日志目录

    我在 CentOS 7 上运行 RStudio Server 1 0 44 根据文档 https support rstudio com hc en us articles 200554766 RStudio Server Applicat
  • 为什么安装的“igraph”包在加载后返回“libicui18n.so.58:无法打开共享对象文件”?

    我试图使用命令 install packages igraph 在 R 中安装 igraph 包 安装后 在测试阶段出现以下错误 测试是否可以加载已安装的包错误 包或命名空间 dyn load file DLLpath DLLpath 中的
  • 完全缺失列的 VaR 计算

    我需要计算股票收益的滚动 VaR 从这篇文章 使用rollapply函数使用R进行VaR计算 https stackoverflow com questions 25045612 using rollapply function for v
  • 为什么 rbind 会抛出警告

    这与是否有更优雅的方法将不规则的数据转换为整洁的数据框 https stackoverflow com questions 25102617 are there more elegant ways to transform ragged d
  • R markdown 引文标识符

    R markdown 允许使用 YAML 元数据部分中的参考书目元数据字段指定参考书目文件 例如 title Sample Document output html document bibliography bibliography bi
  • 如何更改 Quarto pptx 中的字体格式

    我正在 R 中使用 Quarto 创建 pptx 要更改我尝试更改的默认字体格式mainfont范围 但是当我渲染它时 最终的 pptx 文件具有默认字体 Calibri 这是我的文件 YAML 将 Quarto 文件渲染为 pptx 时如
  • 在多面图中用 N 注释 x 轴

    我正在尝试生成一些按治疗条件和访问次数细分的数字结果的箱线图 每个框中的观察次数都放在图下方 并且也标记了访问次数 这里有一些虚假数据可以用来说明 我举了两个我尝试过但不太有效的例子 library ggplot2 library plyr

随机推荐

  • K 表示使用 PySpark 进行聚类

    我有一个非常大的数据框 我必须使用数据框中的特定 8 列 其中值要么是 强烈同意 同意 或 不同意 根据这 8 列 我需要创建一个新列来告诉该行属于哪个簇 1 8 最好使用 K 均值聚类 这在 PySpark 中可能吗 PS 我是 PySp
  • CodeIgniter 动态语言功能

    我是 Codeigniter 我需要为用户提供动态语言 我在标题处添加了下拉菜单 我希望允许用户在前端更改网站的语言 我尝试在一个控制器中使用以下代码更改语言 this gt config gt set item language span
  • JProgressBar 未更新

    我制作了一个非常简单的代码来在此处显示它 我有一个按钮应该显示 JDialog 来检查进度状态 我正在使用延迟调用来完成 EDT 并且我的循环不在 run 方法中 那么为什么我的酒吧没有更新吗 这是代码 import javax swing
  • RSpec 场景概要:多个测试用例

    使用 RSpec 测试一堆不同测试用例的最佳方法是什么 例如 给定字符串添加 rb https gist github com 899520 require rspec class String if method defined reve
  • Spring RMI 的替代方案是什么? (因为它已被弃用)

    Spring 似乎正在弃用它的 RMI 从 Spring Framework 5 3 开始 出于安全原因和更广泛的行业支持 现已弃用对多种远程技术的支持 支持基础设施将从 Spring Framework 的下一个主要版本中删除 但我找不到
  • PyQt - 如何导入 .qss 文件?

    如何将 qt 的样式表 qss 文件导入到应用程序 在 HTML 中我们使用 那么如何在 PyQt 中完成呢 或者我可以在哪里阅读相关内容 无法通过谷歌搜索或在 Qt 文档中找到它 qss 文件是一个简单的文本文件 如果您想将样式表应用于您
  • 使用 WCF 流上传文件,从流中进行微小读取

    我已经使用WCF的流实现了文件上传 一切都按预期进行 但是我遇到了一个问题 我分配 4kb 缓冲区来从传入流中读取数据 但 WCF 仅读取 255 字节 这是我的上传功能 public UploadResponse UploadFile F
  • 一张 Microsoft SQL 表可以有多个主键吗?

    我一直很好奇 但找不到简洁的答案 有什么帮助吗 它不能有超过一个首要的关键 但是 它的主键中可以有多于一列 它也可以有多个唯一索引 通常 唯一索引是主键 但单个表上可以有多个唯一索引 我一时想不出一个例子 但当我想到的时候我会添加它 EDI
  • 如何修复 Eclipse 警告:“建议插件 'XXX' 从 JAR 运行,指定 'unpack="false"' 属性”

    该插件确实需要解压 是的 我知道它不应该关心 但它确实关心 我只是想让这个警告消失 我该怎么做 尝试设置Bundle ClassPath在你的清单中 这个头告诉 OSGi 在你的包中哪里可以找到这些类 如果未指定 则默认值为 这意味着你的包
  • 列表框未选择所选项目

    请参阅下面的代码视觉工作室2010ListBox 上方有一个 TextBox 通过绑定 当选择某个项目时 文本框可以变大或变小 这会导致列表框移动 当列表框移动时 所选项目不是被单击的项目 所选项目是移动的ListBox 上鼠标下方的项目
  • 从不同线程读取值

    我正在用 Go 编写可以进行大量并行计算的软件 我想从工作线程收集数据 但我不太确定如何以安全的方式做到这一点 我知道我可以使用通道 但在我的场景中 它们使事情变得更加复杂 因为我必须以某种方式在主线程中同步消息 等到每个线程发送一些内容
  • R下载。文件错误无法打开URl

    temp lt tempfile download file file connect me test gz temp 该网址存在是因为我可以将其放入浏览器中 但是当我运行该代码时 出现错误 Error in download file f
  • 将 sqldf 中的整数值转换为日期时间

    我正在使用 sqldf 库返回具有不同值的数据框 并且仅返回日期列的最大值 数据框看起来像这样 NAME val1 val2 DATE A 23 7228 0 5829 11 19 2014 8 17 A 23 7228 0 5829 11
  • AngularFire2 - 如何在页面刷新后保持登录状态

    我正在将 AngularFire2 用于应用程序 并且已经获得了与 Firebase 一起使用的注册 登录功能 但是 每次刷新页面时 登录状态都会重置并且不会持续存在 尽管我觉得我错过了一些非常小的东西 但我不太找到执行此操作的功能 我可以
  • 在 FPC 下的自动化对象中使用标识符或保留字

    实际上我在 Free Pascal 下使用 OLE 自动化 但某些对象具有使用保留字作为名称的属性 因此我无法编译代码 检查这个样本 MyObj OleVariant begin MyObj CrealeOleObject AObject
  • 使用 BottomNavigationBar 根据页面更改 AppBar 标题

    我试图根据用户所在的页面更改 AppBar 标题 页面由加载不同类 页面 的 BottomNavigationBar 控制 我设法改变这一点的唯一方法是为每个页面添加一个应用栏 我认为这不是继续下去的方法 class HomePage ex
  • 如何更改 Android 中滚动条的颜色?

    当前的问题是我们的主题继承自 Theme AppCompat 它似乎有一个白色滚动条 并且在白色背景上不可见 我知道我可以使用
  • 三星 S4 上的蓝牙崩溃

    我正在运行一个带有 BLE 扫描的应用程序 一段时间后在 Samsung S4 上或者如果周围有超过 10 个信标 我会看到此错误 07 18 11 51 57 169 W bt userial 7819 userial read thre
  • 如何在 django admin 中显示我的模型的所有字段?

    此代码显示如下对象 Home Object 1 Home Object 2 但我想在我的 django 管理页面中显示所有模型字段 我该怎么做 我是 django 的初学者 这是我的第一个项目 模型 py class Home models
  • R:如何使 data.table 只读而不复制它(例如用于数据验证)

    我进行数据整理 ETL 以将新数据加载到数据库中 并希望让用户基于我现有的实现自己的数据验证功能data table包含准备好的数据的对象 如何避免用户可以更改 修改 我的数据data table在验证函数中 有意或无意 而不进行复制 因为