在 data.table 中添加具有条件的虚拟对象?

2024-01-05

抱歉问了这么长的问题。我会尽力明确我的目标

我想使用 update 方法在 data.table 中添加虚拟对象,就像这已经在此链接中得到回答 https://stackoverflow.com/questions/18881073/creating-dummy-variables-in-r-data-table,但稍微复杂一点。

为了更好地描述,我创建了数据。

DT <- data.table(UID = paste0("UID",rep(1:5,each=2)), 
                 date = as.IDate(c("2012-01-01","2012-01-02","2012-01-03","2012-01-04","2012-01-05","2012-01-06","2012-02-01","2012-02-02","2012-02-03","2012-02-04")),
                 value = c(1:10)) 

DT是一个数据表,包含UID、日期和值的信息。原始数据中,结构完全相同,但时间跨度较长(2年)。

在这里我想根据日期添加虚拟对象。

日期中有几个特殊的时间跨度,我们可以用假期来表示。

例如,在我上面创建的虚假数据中。

还有两个假期

  1. 从“2012-01-02”到“2012-01-05”
  2. 从“2012-02-02”到“2012-02-03”

我想添加 2 种类型的假人

  1. 关于假期长度的虚拟:首先计算不同假期的长度。在此示例中,我们有两个不同的长度(2 和 4)。因此,我们将添加 2 个虚拟变量来指示该日期是否在这些假期中。

预期结果是这样的:



UID     Date    Val D_length_2  D_length_4
UID1    1/1/2012    1   FALSE   FALSE
UID2    1/2/2012    2   FALSE   TRUE
UID3    1/3/2012    3   FALSE   TRUE
UID4    1/4/2012    4   FALSE   TRUE
UID5    1/5/2012    5   FALSE   TRUE
UID1    1/6/2012    6   FALSE   FALSE
UID2    2/1/2012    7   TRUE    FALSE
UID3    2/2/2012    8   TRUE    FALSE
UID4    2/3/2012    9   FALSE   FALSE
UID5    2/4/2012    10  FALSE   FALSE
  
  1. 关于这一天是假期前一天还是假期后一天的虚拟信息。


UID    Date      Val    Before  After
UID1    1/1/2012    1   TRUE    FALSE
UID2    1/2/2012    2   FALSE   FALSE
UID3    1/3/2012    3   FALSE   FALSE
UID4    1/4/2012    4   FALSE   FALSE
UID5    1/5/2012    5   FALSE   FALSE
UID1    1/6/2012    6   FALSE   TRUE
UID2    2/1/2012    7   TRUE    FALSE
UID3    2/2/2012    8   FALSE   FALSE
UID4    2/3/2012    9   FALSE   FALSE
UID5    2/4/2012    10  FALSE   TRUE
  

所以想要的结果总共是这样的



UID Date    Val Before  After   D_length_2  D_length_4
UID1    1/1/2012    1   TRUE    FALSE   FALSE   FALSE
UID2    1/2/2012    2   FALSE   FALSE   FALSE   TRUE
UID3    1/3/2012    3   FALSE   FALSE   FALSE   TRUE
UID4    1/4/2012    4   FALSE   FALSE   FALSE   TRUE
UID5    1/5/2012    5   FALSE   FALSE   FALSE   TRUE
UID1    1/6/2012    6   FALSE   TRUE    FALSE   FALSE
UID2    2/1/2012    7   TRUE    FALSE   FALSE   FALSE
UID3    2/2/2012    8   FALSE   FALSE   TRUE    FALSE
UID4    2/3/2012    9   FALSE   FALSE   TRUE    FALSE
UID5    2/4/2012    10  FALSE   TRUE    FALSE   FALSE
  

总观测值超过 10M 行,大约有 10 个不同的假期和 4 个不同的长度。

对于第二种类型的假人,我认为

f <- function(x){ 
ifelse(x %in% as.Date(c("2012-01-02","2012-02-02")) - 1, return(TRUE), return(FALSE))
}

DT[,Before:= f(date)] 

但似乎不正确。

对于第一个问题,我没有想出一个好的解决方案。

这个问题是关于 data.table 中的更新,非常欢迎任何关于如何处理它以及如何编写更新函数的想法!


这是一个开始:

library(data.table)

DT <- data.table(UID = paste0("UID",rep(1:5,each=2)), 
                 date = as.IDate(c("2012-01-01","2012-01-02","2012-01-03","2012-01-04","2012-01-05","2012-01-06","2012-02-01","2012-02-02","2012-02-03","2012-02-04")),
                 value = c(1:10)) 
setkey(DT, date)


vacStart <- data.table(start = as.IDate(c("2012-01-02", "2012-02-02")), key="start")
vacEnd <- data.table(date = as.IDate(c("2012-01-05", "2012-02-03")), key="date")

#identify vacations:
vacStart[, Start:=.I]
DT <- vacStart[DT, roll=TRUE]
vacEnd[, End:=.I]
DT <- vacEnd[DT, roll=-Inf]
DT[,vac:=(End==Start)*Start]
DT[is.na(vac), vac:=0L]

#2-day vacations:
DT[,length_2 := (.N==2) & vac!=0, by=vac]
#days before vacation
DT[,before := c(diff(vac)>0, FALSE) & vac==0]
#           date End Start  UID value vac length_2 before
#  1: 2012-01-01   1    NA UID1     1   0    FALSE   TRUE
#  2: 2012-01-02   1     1 UID1     2   1    FALSE  FALSE
#  3: 2012-01-03   1     1 UID2     3   1    FALSE  FALSE
#  4: 2012-01-04   1     1 UID2     4   1    FALSE  FALSE
#  5: 2012-01-05   1     1 UID3     5   1    FALSE  FALSE
#  6: 2012-01-06   2     1 UID3     6   0    FALSE  FALSE
#  7: 2012-02-01   2     1 UID4     7   0    FALSE   TRUE
#  8: 2012-02-02   2     2 UID4     8   2     TRUE  FALSE
#  9: 2012-02-03   2     2 UID5     9   2     TRUE  FALSE
# 10: 2012-02-04  NA     2 UID5    10   0    FALSE  FALSE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 data.table 中添加具有条件的虚拟对象? 的相关文章

  • 如何在不指定数据集的情况下调整函数

    我有一个函数 基本上可以过滤SPV行 如下所示 请注意 我这样做return coef lt function df1 idd dmda CategoryChosse 然而 我不希望df1作为函数的参数 而是函数的属性df1数据集 在本例中
  • 循环遍历列并将字符串长度添加为新列

    我有一个包含多列的数据框 并且希望为每个列输出一个单独的列 其中包含每行的长度 我试图迭代列名称 并为每列输出一个附加有 length 的相应列 例如 col1 col2 将转到 col1 列2 col1 长度 列2 长度 我正在使用的代码
  • glmnet R 包中的 cv.glmnet 出现“drop(y %*% rep(1, nc)) 错误”错误

    我有一个返回 cv glmnet 模型的 auc 值的函数 尽管不是大多数时间 但在执行 cv glmnet 函数时 它经常返回以下错误 下降误差 y 代表 1 NC 在为函数 drop 选择方法时评估参数 x 时出错 y 中的错误 rep
  • 将线条剪裁到绘图区域并在绘图区域外显示文本

    我想限制绘图的可见 y 范围 为了保留超出此范围的值 我需要设置oob 出界 to rescale none这效果很好 不过 我还想在图外的页边空白处添加一些文本 为了做到这一点 我需要关闭剪辑 这会导致超出范围的值被绘制在绘图区域之外的边
  • 为 PDF 输出添加 natbib 选项

    有没有办法指定natibib输出 PDF 时的选项bookdown 我希望 tex 输出具有命令 usepackage sort compress natbib 但似乎没有任何方法可以在 YAML 中指定它 我无法将命令添加到我的序言中 因
  • 有没有办法将字母扩展到超过 26 个字符,例如 AA、AB、AC...?

    我大部分时间都使用字母来表示我的因素 但今天我尝试超过 26 个字符 LETTERS 1 32 期待有自动递归因式分解 AA AB AC 但很失望 这只是字母的限制还是有办法使用其他函数来获取我正在寻找的内容 702够吗 LETTERS70
  • 什么是 data.frame 可以做而 data.table 不能做的事情?

    我刚刚开始使用 R 并遇到了 data table 我发现它很棒 一个非常天真的问题 我可以忽略 data frame 来使用 data table 以避免两个包之间的语法混淆吗 来自数据表常见问题解答 http datatable r f
  • 不同的分位数:箱线图与小提琴图

    require ggplot2 require cowplot d iris ggplot2 ggplot d aes factor 0 Sepal Length geom violin fill black alpha 0 2 draw
  • R 在 Ubuntu 中通过代理连接

    我在 Ubuntu 12 04 上安装了 RStudio 0 97 168 当我尝试安装 gstat 库时出现以下错误 install packages gstat dependencies TRUE Warning in install
  • 为闪亮的应用程序创建桌面图标

    当我在基本 R 提示中提供以下代码时 我会在浏览器中打开一个闪亮的应用程序 shiny runApp C Myapp 我使用 Windows 7 我试图创建一个桌面图标 以避免我的客户每次想要使用该应用程序时都键入上述代码 我创建了一个桌面
  • 如何重试错误语句?

    如果某个语句出错 我如何简单地告诉 R 重试该语句几次 例如 我希望做类似的事情 tryCatch dbGetQuery Query database error function e if is locking error e If da
  • 在 R 中使用科学记数法和 xtable

    我将 data frame 传递给 xtable dat table lt xtable dat 1 20 digits 10 我宁愿使用科学记数法 而不是像那样显示数字 我该怎么做呢 看过了 但我发现的只是R 格式化xtable中的数字
  • 如何将变量传递给 ddply 中的自定义函数?

    考虑以下数据 d data frame experiment as factor c foo foo foo bar bar si runif 5 ti runif 5 我想进行相关性测试si and ti 对于每个experiment因素
  • 在 R 中使用 ggplot2 叠加两个图

    有两个数据框 df1 df2我需要使用 ggplot2 创建线图并显示在同一个图表上 df1 x y 2 30 4 25 6 20 8 15 df2 x y 2 12 4 16 6 20 8 24 用于绘制第一个 df p1 lt ggpl
  • 在 R 中高效加载稀疏矩阵

    我在将数据有效加载到 R 中的稀疏矩阵格式时遇到问题 这是我当前策略的 不完整 示例 library Matrix a1 Matrix 0 5000 100000 sparse T for i in 1 5000 a1 i idxOfCol
  • 在ggplot2中添加水平线到绘图和图例

    这段代码创建了一个漂亮的图 但我想在 y 50 处添加一条水平黑线 并让图例显示一条黑线 并在图例中显示文本 cutoff 但在图例中保留源点 我可以使用 geom line 添加该行 但无法在图例中获取该行 library ggplot2
  • 如何将带有几行代码的字符数组转换为 data.frame?

    我有以下数组 my list lt c Jan 01 Dec 31 00 00 24 00 Jan 01 Jun 30 12 00 18 00 Jul 06 Dec 31 09 00 19 00 导致以下结果的最短代码是什么 x1 x2 x
  • 如何解决 R 估计中的整数溢出错误

    我正在尝试使用估计模型speedglm在 R 中 数据集很大 约 6988 万行和 38 列 行数和列数相乘得到约 27 亿 超出了整数限制 我无法提供数据 但以下示例重现了该问题 library speedglm large exampl
  • 使用 ggplot2 在一张画布上绘制多个图形[重复]

    这个问题在这里已经有答案了 我正在尝试根据此表将两个 ggplot2 图合并为一个图 Type RatingA RatingB 1 One 3 36 2 Two 5 53 3 One 5 57 4 One 7 74 5 Three 4 38
  • 修改x轴刻度标签

    我正在尝试更改由生成的箱线图的 x 轴刻度标签ggplot2 x 轴是一个分类变量 HabFac 我想要的是将其刻度更改为 6 个化学品 A E 下面是我的代码 raw data read table Read data p TT ggpl

随机推荐

  • 将元素与 HTML 表格单元格的底部对齐

    我的 HTML 表格的一个单元格中有多个元素 我希望一些元素与单元格的底部对齐 一些元素与顶部对齐 我无法让元素与底部对齐 我的桌子是 tr td style background color 007CE2 p test br anothe
  • 带有命名空间的 XML 文档上的 XPath

    我有这个带有命名空间的 XML 文档 并且我想使用 XPath 提取一些节点 这是文件
  • Azure 函数在 azure 门户上显示 0 次执行

    我是一个蔚蓝新手 我的设置如下 我有一个 IoT 中心 一个事件中心 一个 Azure 函数 其想法是将消息发送到 IoT 中心 根据某种消息类型将它们路由到事件中心 并使用该函数处理这些事件 我创建了一个示例控制台应用程序 用于将消息从我
  • Ionic 2 范围触摸事件

    我正在尝试在输入末尾使用 Ionic 2 获取范围滑块的值 In the 文档 http ionicframework com docs v2 api components range Range output events唯一可用的事件是
  • ReaderWriterLockSlim 什么时候比简单的锁更好?

    我正在使用这段代码对 ReaderWriterLock 进行一个非常愚蠢的基准测试 其中读取的频率比写入的频率高 4 倍 class Program static void Main ISynchro test new Locked new
  • 类名中有一个“+”?

    班级名称 MyAssembly MyClass MyOtherClass 问题显然是 作为分隔符 而不是传统的点 它的作用 并查找官方文档 看看其他分隔符是否存在 这就是嵌套类型的表示方式 例如 namespace Foo class Ou
  • ASP.NET API 无法在 Azure 上发布

    我正在尝试将 C API 发布到 azure 我遵循了中的所有步骤本文档 https learn microsoft com en us aspnet core tutorials publish to azure api manageme
  • 对于接近统一的值,浮点数学是否更精确?

    Question 我多次被告知 如果运算的数字接近于浮点运算 则浮点运算具有最高的精度 1 0 或者有时0 1 有没有道理呢 澄清 我所说的 算术 是指诸如a b a b a b 但是也sqrt x 和其他数学函数 具体来说 假设所有变量都
  • Python 中的 CRC16

    如何在Python中计算CRC16 在 Perl 中我会写这样的东西 use Digest CRC crc16 result crc16 str 我如何在Python中做同样的事情 这里有一个计算CRC16的库http pypi pytho
  • 如何检查数组的所有元素是否相同?

    即 验证 a 0 1 a 0 1 a 0 1 a 0 1 a 0 1 a 0 1 a 0 1 a 0 1 but not a 0 1 a 0 2 a 0 1 a 0 1 a 0 1 a 0 1 a 0 1 a 0 1 谢谢 count ar
  • 如何将字节值转换为小数?

    我正在尝试从文件中加载一些十进制值 但我无法找出获取原始值并将其转换为小数的正确方法 我已将文件读入字节数组 每个四个字节块应该代表一个十进制值 为了帮助解决这个问题 我构建了一个表格 其中说明十进制值 1 到 46 如何表示为四个字节块
  • Visual Studio 调试器跳过断点

    在调试单元测试时 我的 Visual Studio 2008 IDE 的行为非常奇怪 我有一个断点 当我点击它并尝试使用 F10 单步执行时 测试就会结束 如果我在被测试方法内的每一行上设置断点 我最终会得到一个随机断点 而不是下一行的下一
  • 切割频谱图 matplotlib 中未使用的频率

    我有一个采样率为 16e3 的信号 其频率范围为 125 到 1000 Hz 因此 如果我绘制一个频谱图 由于所有未使用的频率 我会得到一个非常小的颜色范围 我尝试通过设置 x 限制来修复它 但这不起作用 有没有办法切断未使用的频率或用 N
  • 达到虚拟实时时间限制(178/120秒)

    我使用的是ubuntu 16版本并运行Odoo erp系统12 0版本 在我的应用程序日志文件中 我看到信息显示 已达到虚拟实时时间限制 178 120 秒 它到底意味着什么以及它会对我的应用程序造成什么损害 另外我如何增加虚拟实时限制 它
  • 无法加载本机 TensorFlow 运行时。原因:未找到图像。我究竟做错了什么?

    在配备四核 I7 和 NVIDIA GeForce GT 650M 的 Macbook Pro 上运行 从 virtualenv 运行 Tensorflow 时收到此错误消息 我做错了什么 我使用的是 protobuf 版本 3 2 0 t
  • 在没有 BindingSource 的情况下使用 BindingNavigator

    我有一个在数据库中完成分页的应用程序 也就是说 检索项目列表的调用包括页码 页面大小 并且将仅返回该页面的数据 例如 ItemCollection items ListAllItems 1 20 page 1 show 20 items p
  • Visual Studio 2010 RC 中的 IntelliSense 冻结

    每次我尝试编写一些内容时 IntelliSense 都会冻结 Visual Studio 我必须等待大约 2 分钟才能显示代码完成列表 我能使用的唯一方法就是完全关闭它 我已经安装了 Microsoft 的最后一个 IntelliSense
  • 如何在 Django 中为(基于类的)通用对象列表创建过滤器表单?

    我正在使用 Django 1 3 的基于类的通用视图来显示图像列表 但我想添加一个过滤器 使用户能够缩小显示结果的范围 我目前的方法有效 但感觉很黑客 class ImageFilterForm ModelForm class Meta m
  • 如何:优化 Symfony 表单的性能?

    我有一个表单 它是我的 ajax 请求的瓶颈 order this gt getDoctrine gt getRepository AcmeMyBundle Order gt find id order order order new Or
  • 在 data.table 中添加具有条件的虚拟对象?

    抱歉问了这么长的问题 我会尽力明确我的目标 我想使用 update 方法在 data table 中添加虚拟对象 就像这已经在此链接中得到回答 https stackoverflow com questions 18881073 creat