如何检查向量是否是 LIFO/FIFO 递减

2024-01-01

假设我有一个 data.table,其中每行由两个向量组成:

  1. “预减法”向量。
  2. “减法后”向量。

减法前是最左半列,减法后是最右列,末尾带有后缀“prm”。

例如:

#Sample Data
set.seed(2)
fill = data.table(n=1:7)
Tp=3

  for(t in 1:Tp){ 
     set(x = fill, j = paste0('v',t), value = sample(0:10,7))
  }

fill[1,paste0('v',3):=0]
fill[5,paste0('v',2):=0]
fill[5,paste0('v',3):=0]

for(t in 1:Tp){ 
  fill[,paste0('v',t,'prm'):=get(paste0('v',t))]
}


fill[1,paste0('v',1,'prm'):=0] 
fill[2,paste0('v',2,'prm'):=1]   
fill[5,paste0('v',3,'prm'):=1]  
fill[7,paste0('v',3,'prm'):=2] 

数据:

> fill
   n         v1         v2         v3          v1prm         v2prm        v3prm
1: 1          2          9          0             0             9             0
2: 2          7          4          8             7             1             8
3: 3          5         10          9             5            10             9
4: 4          1          8          1             1             8             1
5: 5          6          0          0             6             0             1
6: 6          8          7          0             8             7             0
7: 7          0          0          6             0             0             2

后进先出向量必须先向右元素递减,然后才能影响更左边的元素。第一行违反了 LIFO 因为

(2, 9, 0) --> (0, 9, 0)应该从最左边单元的 2 之前的 9 中减去 2。

我想进行子集化,以仅包含具有“prm”列的行作为非 prm 列的 LIFO 减法。例如。

   n         v1         v2          v3          v1prm         v2prm        v3prm
1: 3          5         10          9             5            10             9
2: 4          1          8          1             1             8             1
3: 6          8          7          0             8             7             0
4: 7          0          0          6             0             0             2       

EDIT:

LIFO(后进先出)和 FIFO(先进先出)是对某些元素进行优先级排序的减法方法。

考虑一个数字向量 (a,b,c)。将“c”视为最新的,将“a”视为最近的。

该向量中的单元总数为 a+b+c。

如果我们从中减去 d 个单位,在 LIFO 或 FIFO 减法下,我们不会从每个元素中减去 d,而是从最近的 (LIFO) 或最近的 (FIFO) 中按元素减去它,直到它耗尽(使用分钟为 0)。

例如

后进先出:(3,2,1) - 5 = (3,2,1 - 5) --> (3,2 -4 ,0) --> (3 -2 ,0,0) --> (1 ,0,0)

先进先出:(3,2,1) - 5 = (3-5,2,1) --> (0,2 -2 ,1) --> (0 ,0,1)


以下是在过滤具有 lifo 向量的行之前首先计算 lifo 向量的可能方法:

#convert into long format from MichaelChirico and svenkatesh
tbl <- melt(fill, meas=patterns("^v[1-9]$", "prm$"), 
    value.name=c("bef","aft"))
setorder(tbl, n, -variable)

     #filter for those lifo vector
fill[n %in% 
        tbl[, {
                #calculate stock taken out
                dif <- sum(bef) - sum(aft)

                #calculate lifo vector
                lifo <- pmin(pmax(cumsum(bef) - dif, 0L), bef)

                #check if after is this lifo vector
                identical(lifo, aft)

            }, by=.(n)][(V1), n]
    ]

output:

   n v1 v2 v3 v1prm v2prm v3prm
1: 3  5 10  9     5    10     9
2: 4  1  8  1     1     8     1
3: 6  8  7  0     8     7     0
4: 7  0  0  6     0     0     2

data:

library(data.table)
fill <- structure(list(n = 1:7, v1 = c(2L, 7L, 5L, 1L, 6L, 8L, 0L), v2 = c(9L, 
    4L, 10L, 8L, 0L, 7L, 0L), v3 = c(0L, 8L, 9L, 1L, 0L, 0L, 6L), 
    v1prm = c(0L, 7L, 5L, 1L, 6L, 8L, 0L), v2prm = c(9L, 1L, 
        10L, 8L, 0L, 7L, 0L), v3prm = c(0L, 8L, 9L, 1L, 1L, 0L, 2L
        )), row.names = c(NA, -7L), class = c("data.table", "data.frame"
        ))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查向量是否是 LIFO/FIFO 递减 的相关文章

随机推荐

  • [React]将异步数据获取到组件中的不同方式

    我对 React 世界有点陌生 最近当我开始在组件内编写 Ajax 内容时 我感到很困惑 据我所知 这里有两种渲染方式异步将数据放入组件中 如下所示 1st way class MyComponent extends React Compo
  • 使用 free() 时出现分段错误

    此代码会导致分段错误 int main char p char a 50 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa p char malloc 50 sizeof char if p
  • “[文章] 使用 WSO2 API Manager 启用 API 货币化”相关问题

    我尝试根据文章将 POC WSO2 APIM 与计费引擎集成1 http wso2 com library articles 2016 07 article enabling monetization of apis with wso2 a
  • 将值和数字格式从一个范围复制到另一个范围?

    下面的行没有出现错误 我将值从一个范围复制到另一个范围 ThisWorkbook Sheets Output Range F lastRowOutput 1 M lastRowOutput 1 Value projectWb Sheets
  • 使用 Zoom SDK 最小化视频通话和共享视图

    我正在尝试将 Zoom SDK 会议集成到 Android 应用程序中 我已经努力使用自定义会议用户界面并学习如何使用 Zoom 的视频视图 称为MobileRTCVideoView 这是我想创建的界面 我尝试过的 研究了 Zoom 的示例
  • 在本机 C++ 中锁定 GDI+ 位图?

    我可以找到很多关于如何在托管 c 中执行此操作的示例 但没有找到非托管的示例 我希望尽可能高效地获取所有像素数据 但我需要更多有关 scan0 内容的一些信息 以便我可以正确地迭代像素数据并从中获取每个 rgba 值 现在我有这个 Bitm
  • lxml 在 Solaris 10 上构建

    请您就 python 2 6 6 和 lxml Solaris 10 构建问题提供帮助和建议吗 安装说明 www sunfreeware com download html 直接链接到文件 http www sunfreeware com
  • CSS 动画 onclick 和反转 next onclick

    我正在使用精灵表和关键帧在单击按钮时为按钮上的图像设置动画 当单击按钮时 我希望帧沿一个方向运行 并将按钮保留在精灵表中的最后一个图像上 当再次单击按钮时 我希望相同的帧向后运行 将按钮保留在精灵表中的第一个图像上精灵表 我目前正在尝试使用
  • 将更新的函数传递给现有函数

    在这个简短的序列中 用户创建了一个函数userfunc 但随后想要更新第一个定义以执行不同的操作 但是 那programfunc 已经编译了第一个版本 并继续使用它 userfunc str n str n userfunc hello 3
  • 处理 iOS 和 Android 上的推送通知场景

    我想为应用程序 iOS 和 Android 实现推送通知 并需要澄清以下场景 我了解推送通知的一般工作原理和局限性 我确实阅读了文档 但这让我感到困惑 并且没有回答我所有的问题 iOS 和 Android 中如何处理以下场景 当设备关闭时
  • 单声道安卓。单元测试框架[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有一些支持单声道 Android 应用程序的单元测试框架 我已经尝试过默认的 Visual Studio 测试框架和 NUnit 框架
  • 多个 ssh 密钥

    好吧 我在 ssh 帖子中看到了拥有多个私钥的答案 但我没有获得足够的声誉来添加任何评论 所以我必须写一个新问题 对此感到抱歉 在帖子中 给出的答案是配置文件 用于将每个主机 用户名定向 指向 它应该使用的私钥文件 但是有没有办法拥有一个供
  • 面板.repaint();打乱布局

    JPanel启动 p new JPanel private static final long serialVersionUID 1L public void paintComponent Graphics g if errors 1 g
  • 使用 SSIS 发送邮件任务发送邮件

    我想使用 SSIS 发送带有附件的电子邮件 但出现以下错误 发送邮件任务 错误 发生错误并出现以下错误 消息 SMTP 服务器需要安全连接 否则客户端 未经过验证 服务器响应为 5 5 1 身份验证 必需的 了解更多信息 请访问 下面是我的
  • 创建可扩展 WPF 用户控件的提示

    我是 WPF 新手 我正在创建一个应用程序 允许我控制我的 MIDI 设备 为此 我创建了一个键盘用户控件 我认为它看起来很棒 但我不知道如何设计它 以便它在绘制到窗口时可以缩放 有人可以帮忙提供修改以下 xaml 的任何提示吗
  • Android 进度条不显示

    我有一个应该在 AsyncTask 中运行的进度条 但它没有出现 尽管任务运行 XML
  • strtolower 和 mb_strtolower 有什么区别?

    在 PHP 中 有什么区别strtolower and mb strtolower 如果我想将提交的电子邮件地址转换为小写 我应该使用哪一个 有没有这样的邮件 email protected cdn cgi l email protecti
  • 如何从Linux命令行使用curl发送数据?

    我正在尝试通过 wifi 连接从嵌入式 Linux 设备传输数据 我的设备上有curl 和wget 如何使用curl或wget将数据传输出设备 欢迎任何指点 如果您只想发送 键 值 对 那么 curl d key1 value1 d key
  • Perl:如果 IPC::Run 终止,则从进程中检索输出

    我一直在运行一些命令IPC Run https metacpan org pod IPC Run模块 一切都很好 除了我无法访问输出 STDOUT STDERR 生成的过程并被重定向到变量中 有没有办法在错误处理中检索这些内容 comman
  • 如何检查向量是否是 LIFO/FIFO 递减

    假设我有一个 data table 其中每行由两个向量组成 预减法 向量 减法后 向量 减法前是最左半列 减法后是最右列 末尾带有后缀 prm 例如 Sample Data set seed 2 fill data table n 1 7