在data.table中动态创建新列

2023-12-02

我在 R 中有一个 data.table,想要创建一个新列。假设我将日期列名称保存为变量并想要附加_year到新列中的该名称。我可以通过指定名称来完成正常的路由,但是如何使用date_col多变的。

这是我尝试过的。我想要的最后两个不起作用。

dat = data.table(one = 1:5, two = 1:5, 
                 order_date = lubridate::ymd("2015-01-01","2015-02-01","2015-03-01",
                           "2015-04-01","2015-05-01"))
dat
date_col = "order_date"
dat[,`:=`(OrderDate_year = substr(get(date_col)[!is.na(get(date_col))],1,4))][]
dat[,`:=`(new = substr(noquote(get(date_col))[!is.na(noquote(get(date_col)))],1,4))][]
dat[,`:=`(paste0(date_col, "_year", sep="") = substr(noquote(get(date_col))[!is.na(noquote(get(date_col)))],1,4))][]
dat[,`:=`(noquote(paste0(date_col, "_year", sep="")) = substr(noquote(get(date_col))[!is.na(noquote(get(date_col)))],1,4))][]

最后两条语句返回错误消息:

dat[,`:=`(paste0(date_col, "_year", sep="") = substr(noquote(get(date_col))[!is.na(noquote(get(date_col)))],1,4))][]
Error: unexpected '=' in "dat[,`:=`(paste0(date_col, "_year", sep="") ="
dat[,`:=`(noquote(paste0(date_col, "_year", sep="")) = substr(noquote(get(date_col))[!is.na(noquote(get(date_col)))],1,4))][]
Error: unexpected '=' in "dat[,`:=`(noquote(paste0(date_col, "_year", sep="")) ="

调用的正确语法:=()函数是:

dat[, `:=`(paste0(date_col, "_year", sep = ""), 
           substr(noquote(get(date_col))[!is.na(noquote(get(date_col)))], 1, 4))][]
dat[, `:=`(noquote(paste0(date_col, "_year", sep = "")), 
           substr(noquote(get(date_col))[!is.na(noquote(get(date_col)))], 1, 4))][]

即替换= by ,.


然而,赋值语法和右手边太复杂了。

The order_date列已经属于类Date:

str(dat)
Classes ‘data.table’ and 'data.frame':    5 obs. of  3 variables:
 $ one       : int  1 2 3 4 5
 $ two       : int  1 2 3 4 5
 $ order_date: Date, format: "2015-01-01" "2015-02-01" ...
 - attr(*, ".internal.selfref")=<externalptr>

为了提取年份,year()可以使用函数(从data.table包或lubridate打包最后加载的内容),因此不需要转换回字符并提取年份字符串:

date_col = "order_date"
dat[, paste0(date_col, "_year") := lapply(.SD, year), .SDcols = date_col][]
   one two order_date order_date_year
1:   1   1 2015-01-01            2015
2:   2   2 2015-02-01            2015
3:   3   3 2015-03-01            2015
4:   4   4 2015-04-01            2015
5:   5   5 2015-05-01            2015

或者,

dat[, paste0(date_col, "_year") := year(get(date_col))][]
dat[, `:=`(paste0(date_col, "_year"), year(get(date_col)))][]

工作也一样。

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

在data.table中动态创建新列 的相关文章

随机推荐

  • sqlite全文搜索中的sql注入

    考虑 sqlite3 fts4 表 c execute CREATE VIRTUAL TABLE docs USING fts4 content 以下内容是否可以避免 txt 包含字符串的 sql 注入 我不确定参数化查询是否安全 因为只有
  • Visual Studio 部署项目可选桌面快捷方式

    您好 我正在尝试获取与 VS2010 部署项目集成的可选桌面快捷方式 我在设置的部分添加了 TargetMachine 文件系统的 用户桌面 的快捷方式 并且在用户界面中设置了一个复选框对话框 如何让 Checkbox1Property 转
  • 在每个jsp页面中包含css和js文件

    我有常见的 css 和 js 文件 它们包含在每个 jsp 文件中 那么将它们包含在每个页面中的最佳实践是什么 我以前用过但我想知道这是否是最好 最干净的继续方式 我喜欢为此使用片段 它们是 JSP 支持的标准 因此不需要其他依赖项 正如您
  • Excel 2010 VBA 单步执行字符串并按顺序将一个字符放入每个单元格中

    很多很多年前 我已经习惯在 C 中进行字符串切片 但我正在尝试使用 VBA 来完成此特定任务 现在我已经创建了一个字符串 这是一个字符串 并创建了一个新的工作簿 我现在需要的是使用字符串切片将 t 放入 A1 h 放入 A2 i 放入 A3
  • AngularDart:路由名称的命名空间也分层?

    考虑以下分层路由的初始化 摘自AngularDart 教程 router root addRoute name add path add enter view view addRecipe html addRoute name recipe
  • 如何在IntelliJ IDEA中设置SDK?

    我没有找到任何在 IntelliJ IDEA 中设置 SDK 的方法 在 ubuntu 16 04 LTS 中找不到为 IntelliJ IDEA 设置 SDK 的任何路径 我正在使用这个 IDE 来处理 mongodb 但由于这个问题无法
  • Delphi 中的库项目是否有条件定义?

    我有一个实用程序单元 其中的代码在一些应用程序和 DLL 之间共享 我想根据当前项目类型有选择地编译本单元的部分内容 应用程序 包或库 我在中找不到库或包的任何条件定义System单位 Google 没有找到任何相关内容 那么 是否有任何条
  • 删除行后释放 postgres 数据库中的存储空间的步骤?

    我超过了 Heroku 上 postgres 数据库的 GB 限制 我找到了一个 非常大的 已弃用的表并运行Plot delete all 现在 17k 行表中有 0 行 我现在可以看到行号有差异 但 GB 没有差异 这是之前的数据大小 3
  • 将 NSPredicate 应用于 [(String, Array)]

    我以这种方式存储数据 var data String Array
  • Javascript 中两个日期初始化的差异

    为什么要做这些两个日期不同 var date1 new Date date1 setFullYear 2012 year four digits date1 setMonth 10 month from 0 11 date1 setDate
  • C++ 回调将文本发送回 C#

    我是 C 新手 我被告知使用 C 的 回调 是最好的解决方案 这是我的情况 我有一个用 C 编写的 DLL这个 DLL 有一个方法来启动通过 C 代码运行的服务 这工作正常 当 DLL 中的服务运行时 我希望 DLL 将文本传递回 C 代码
  • 无法解析:com.google.firebase:firebase-analytics:9.0.0 [重复]

    这个问题在这里已经有答案了 根据Google I O 2016 我知道 Firebase 它对我来说非常好 但我无法使用它 因为这个错误 我得到了一个解决方案 将 Google play services 更新到30 但没有更新尖端 您必须
  • 如何将设备函数中分配的内存复制回主内存

    我有一个包含主机函数和设备函数的 CUDA 程序执行 在主机函数中 我分配了一个全局内存output然后它将被传递给设备函数并用于存储设备函数内分配的全局内存的地址 我想访问主机函数中内核分配的内存 以下是代码 include
  • 循环遍历图像目录并将它们旋转 x 度并保存到目录

    我正在使用 Python Open Numpy 和 Scipy 我有一个图像目录 我想将其旋转一定角度 我想编写这个脚本 我正在用这个 OpenCV Python 将图像围绕特定点旋转 X 度但它似乎并不完全按照我的设想进行 我得到了指定的
  • 多个元素的 jQuery UI 自动完成格式

    我的 jQuery UI 自动完成设置符合我的喜好并且工作完美 但有一个致命的缺陷 在我的自动完成中 我使用自定义显示就像这个例子 我有一些非常相似的东西 但有一个例外 唯一的区别是我在该页面上有多个同一类的自动完成元素 只有第一个元素显示
  • 转换为 Dalvik 格式失败,错误 2 adt 16.0.1

    最近我们将 eclipse adt 插件更新到了 16 版本 现在无法运行我们的应用程序 它可以正常编译 但是当我们运行时 它会抛出以下错误 写入输出时遇到问题 016be7fe 0032 没有扩展操作码 sget object v4 Lo
  • 当你可以用 <<< 和结束分隔符填充字符串时,它被称为什么?

    我知道在 C 和 PHP 中 您可以用硬编码文本填充字符串或文件 如果我没记错的话 它应该是这样的 var lt lt lt DELIMITER Menu for program X 1 Add two numbers 2 Substrac
  • 计算带有空白的唯一值Excel公式

    我正在尝试使用公式计算 Excel 中的唯一值 我尝试使用下面的公式 但它返回 DIV 0 错误 因为我的范围中有空格 无论如何 是否可以使用公式来计算带有空白的范围内的唯一值 任何有关此问题的帮助将不胜感激 SUM 1 COUNTIF U
  • 在 Linux C++ 上检测 keydown 和 keyup 事件 [重复]

    这个问题在这里已经有答案了 可能的重复 访问 C 中的击键 监控 Ubuntu 中的键盘按键 我想检测程序中的每个 keydown 和 keyup 事件并为其添加时间戳 是的 我的意思是keydown and keyup不仅仅是按键 以及按
  • 在data.table中动态创建新列

    我在 R 中有一个 data table 想要创建一个新列 假设我将日期列名称保存为变量并想要附加 year到新列中的该名称 我可以通过指定名称来完成正常的路由 但是如何使用date col多变的 这是我尝试过的 我想要的最后两个不起作用