如何在非零价格行之前重复数据框中价格为 0 的行?

2023-12-10

我有一个数据

   WEEK PRICE QUANTITY SALE_PRICE
   4992  3.49 1908.750       0.00
   4999  2.50 5681.000       2.50
   5001  3.00 3187.000       3.00
   5002  3.49 1455.000       0.00
   5008  2.69 2263.500       2.69
   5011  3.49 1515.500       0.00
   5013  2.69 3297.000       2.69
   5015  3.49 1059.500       0.00
   5023  2.50 6056.000       2.50
   5024  3.00 1954.500       3.00
   5026  3.49 1163.833       0.00
   5037  2.50 6797.000       2.50
   5038  3.00 2109.000       3.00
   5040  2.50 4521.000       2.50
   5041  3.33 2469.000       3.33

我想仅在具有销售价格的行之前不存在销售价格为 0 的行的地方,在非零销售价格之前重复最后观察到的销售价格为 0 的行。输出应如下所示:

  WEEK PRICE QUANTITY SALE_PRICE TYPE
  4992  3.49 1908.750       0.00    3
  4999  2.50 5681.000       2.50    3
  4992  3.49 1908.750       0.00    3
  5001  3.00 3187.000       3.00    3
  5002  3.49 1455.000       0.00    3
  5008  2.69 2263.500       2.69    3
  5011  3.49 1515.500       0.00    3
  5013  2.69 3297.000       2.69    3
  5015  3.49 1059.500       0.00    3
  5023  2.50 6056.000       2.50    3
  5015  3.49 1059.500       0.00    3
  5024  3.00 1954.500       3.00    3
  5026  3.49 1163.833       0.00    3
  5037  2.50 6797.000       2.50    3
  5026  3.49 1163.833       0.00    3
  5038  3.00 2109.000       3.00    3
  5026  3.49 1163.833       0.00    3
  5040  2.50 4521.000       2.50    3
  5026  3.49 1163.833       0.00    3
  5041  3.33 2469.000       3.33    3

Data

structure(list(WEEK = c(4992L, 4999L, 5001L, 5002L, 5008L, 5011L, 
5013L, 5015L, 5023L, 5024L, 5026L, 5037L, 5038L, 5040L, 5041L
), PRICE = c(3.49, 2.5, 3, 3.49, 2.69, 3.49, 2.69, 3.49, 2.5, 
3, 3.49, 2.5, 3, 2.5, 3.33), QUANTITY = c(1908.75, 5681, 3187, 
1455, 2263.5, 1515.5, 3297, 1059.5, 6056, 1954.5, 1163.833, 6797, 
2109, 4521, 2469), SALE_PRICE = c(0, 2.5, 3, 0, 2.69, 0, 2.69, 
0, 2.5, 3, 0, 2.5, 3, 2.5, 3.33)), .Names = c("WEEK", "PRICE", 
"QUANTITY", "SALE_PRICE"), class = "data.frame", row.names = c(NA, 
-15L))

我努力了

 if(nrow(price.hierarchy) > 2) {
  for(i in 2: (nrow(price.hierarchy) - 1)) {
      if(price.hierarchy$SALE_PRICE[i] !=0 & price.hierarchy$SALE_PRICE[i+1] !=0 & price.hierarchy$SALE_PRICE[i-1]==0) {
        price.hierarchy1 <- price.hierarchy[which(price.hierarchy[, 1] > price.hierarchy[i,1]), ]
        price.hierarchy[i+1, ] <- NA 
        price.hierarchy[i+1, ] <- price.hierarchy[i-1, ]
        price.hierarchy2 <- price.hierarchy[which(price.hierarchy[, 1] < price.hierarchy[i+2,1]), ] 
        price.hierarchy <- rbind(price.hierarchy2, price.hierarchy1)        
      }
      else 
        price.hierarchy
    }
  }

这使:

> price.hierarchy
    WEEK PRICE QUANTITY SALE_PRICE
1   4992  3.49 1908.750       0.00
2   4999  2.50 5681.000       2.50
3   4992  3.49 1908.750       0.00
31  5001  3.00 3187.000       3.00
4   5002  3.49 1455.000       0.00
5   5008  2.69 2263.500       2.69
6   5011  3.49 1515.500       0.00
7   5013  2.69 3297.000       2.69
8   5015  3.49 1059.500       0.00
9   5023  2.50 6056.000       2.50
10  5015  3.49 1059.500       0.00
101 5024  3.00 1954.500       3.00
11  5026  3.49 1163.833       0.00
12  5037  2.50 6797.000       2.50
13  5026  3.49 1163.833       0.00
131 5038  3.00 2109.000       3.00
14  5040  2.50 4521.000       2.50
15  5041  3.33 2469.000       3.33

The shift函数来自data.table在这里可能有用。

我想重复之前观察到的最后一行,销售价格为 0 仅在没有销售行的地方非零销售价格 价格为 0 的行前有促销价

如果没有更多解释,我不确定后面的要求。这是一个快速解决方案,可以为观察结果提供标识符i出于排序目的,然后复制并附加零销售价格之前的内容。最后,对标识符进行排序,调整为将重复行放置在原始行之后两行。

library(data.table)

setDT(d)
d[, i := seq_len(.N)]
d[, led_zero := shift(SALE_PRICE, type = "lead") == 0]
d_duped = d[(led_zero)][, i := i + 1.5]
d_out = rbind(d, d_duped)
d_out[order(i)]
#     WEEK PRICE QUANTITY SALE_PRICE    i led_zero
#  1: 4992  3.49 1908.750       0.00  1.0    FALSE
#  2: 4999  2.50 5681.000       2.50  2.0    FALSE
#  3: 5001  3.00 3187.000       3.00  3.0     TRUE
#  4: 5002  3.49 1455.000       0.00  4.0    FALSE
#  5: 5001  3.00 3187.000       3.00  4.5     TRUE
#  6: 5008  2.69 2263.500       2.69  5.0     TRUE
#  7: 5011  3.49 1515.500       0.00  6.0    FALSE
#  8: 5008  2.69 2263.500       2.69  6.5     TRUE
#  9: 5013  2.69 3297.000       2.69  7.0     TRUE
# 10: 5015  3.49 1059.500       0.00  8.0    FALSE
# 11: 5013  2.69 3297.000       2.69  8.5     TRUE
# 12: 5023  2.50 6056.000       2.50  9.0    FALSE
# 13: 5024  3.00 1954.500       3.00 10.0     TRUE
# 14: 5026  3.49 1163.833       0.00 11.0    FALSE
# 15: 5024  3.00 1954.500       3.00 11.5     TRUE
# 16: 5037  2.50 6797.000       2.50 12.0    FALSE
# 17: 5038  3.00 2109.000       3.00 13.0    FALSE
# 18: 5040  2.50 4521.000       2.50 14.0    FALSE
# 19: 5041  3.33 2469.000       3.33 15.0       NA
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在非零价格行之前重复数据框中价格为 0 的行? 的相关文章

  • 在 R 中绘制决策树(插入符)

    我已经训练了一个数据集rf方法 例如 ctrl lt trainControl method LGOCV repeats 3 savePred TRUE verboseIter TRUE preProcOptions list thresh
  • 如何在 R 中使用别名运行系统可执行文件?

    假设我正在 R 中运行系统命令来运行executable inputfile lt path myfile txt 我该如何更换 path myfile txt在下面的命令中inputfile如下面命令所示 system executabl
  • rgdax(coinbase)数据未按预期收集数据

    我正在尝试使用rgdaxR 包用于下载一些历史价格 我设置了 API 密钥等 并尝试在过去 24 小时内加载 start lt strftime Sys time Y m dT H M SZ tz UTC end lt strftime S
  • R中的预测和预测函数之间的区别

    两者之间有什么区别吗predict and forecast R 中的函数 如果是 在哪些具体情况下应该使用它们 Intro predict 适用于多种 R 对象 模型 基础库的一部分 forecast 对于时间序列 预测包的一部分 参见示
  • 在 R 中根据时间序列数据制作 3D 曲面

    我有一个大型数据集 我想从中制作 3D 表面 我希望 x 轴为日期 y 轴为时间 24 小时 z 轴 高度 为我的值 我是 R 初学者 所以越简单越好 http www quantmod com examples chartSeries3d
  • spplot 的图例范围和颜色分布问题

    我的绘图和图例中的颜色范围是否正确存在问题 这是我使用的代码 data ch4 lt read csv2 v42 CH4 1970 TOT txt skip 3 stringsAsFactors FALSE header F num dat
  • 如何很好地注释 ggplot2(手册)

    Using ggplot2我通常使用geom text和类似的东西position jitter注释我的情节 然而 对于一个漂亮的情节 我经常发现手动注释是值得的 像下面这样 data2 lt structure list type str
  • 如何根据值扩展数据框? [复制]

    这个问题在这里已经有答案了 我有以下输入数据框 df lt data frame x c a b c y c 4 5 6 from c 1 2 3 to c 2 4 6 df x y from to 1 a 4 1 2 2 b 5 2 4
  • 直接来自数据的马尔可夫模型图(makovchain 或 deemod 包?)

    我想读取一堆因子数据并从中创建一个可以很好地可视化的转换矩阵 我发现了一个非常好的软件包 称为 heemod 它与 diagram 一起工作得不错 对于我的第一个快速而肮脏的方法 我运行了一段 Python 代码来获取矩阵 然后使用这个 R
  • R + ggplot2 - 无法分配大小为 128.0 Mb 的向量

    我有一个 4 5MB 9 223 136 行 的文件 其中包含以下信息 0 0 0 0147938 3 67598e 07 0 0226194 7 35196e 07 0 0283794 1 10279e 06 0 033576 1 470
  • dplyr::mutate 添加多个值

    网上有几个与此相关的问题dplyr Github 存储库 https github com hadley dplyr已经 并且至少有一个相关的问题 但没有一个问题完全涵盖了我的问题 我认为 在 dplyr mutate 调用中添加多列 ht
  • 如果我有一个包含计数的表格,如何获得直方图/摘要统计数据? [复制]

    这个问题在这里已经有答案了 我习惯了像这样的观察向量c 1 1 1 3 4 我可以在上面看到汇总统计数据和绘制直方图等 但现在我发现自己拥有相同的数据 但采用如下压缩格式 value numObs 1 3 3 1 4 1 当数据以data
  • 如何在 R 中更新和重新编译 nlme 源代码

    我正在尝试更新 nlme 包 以便我可以在 gls 命令中使用大圆距离进行相关性 我正在尝试使用指定的更改来编辑源代码here http r 789695 n4 nabble com nlme spatial autocorrelation
  • 列表列表中出现的频率

    我有一个列表列表 其中每个列表都已排序 我想调查的是某个元素在特定位置出现了多少次 例如 pnc 曾两次出现在第二位 一次出现在第三位 我的数据结构如下 dput degree l list c schwab 0 pnc 0 0344827
  • 如何在双对数图(ggplot2)中添加趋势线?

    我需要绘制一个遵循幂律分布的数据向量 所以如果我将它们绘制在对数轴上 它们将是一条直线 但是 如果我没有明确提供 y 参数 我不知道如何绘制 这是代码 library poweRlaw library ggplot2 xmin 1 alph
  • 将 dplyr 中的starts_with与部分列名称的向量一起使用

    我想使用 dplyr 选择与字符串向量匹配的某些列 one lt seq 1 10 two lt rnorm 10 three lt runif 10 1 2 four lt 10 1 df lt data frame one two th
  • R 中自定义函数的等高线图

    我正在使用一些自定义函数 我需要根据参数的多个值为它们绘制轮廓 这是一个示例函数 我需要画这样的等高线图 任何想法 Thanks 首先你构造一个函数 fourvar它将这四个参数作为参数 在这种情况下 您可以使用 3 个变量来完成此操作 其
  • R中不重复的组合

    我试图获取变量元素长度为 3 的所有可能组合 虽然它部分地与combn 一起工作 但我没有完全得到我正在寻找的输出 这是我的例子 x lt c a b c d e t combn c x x 3 我得到的输出看起来像这样 1 2 3 1 a
  • 将从数据透视表包生成的数据透视表转换为数据帧

    我正在尝试制作一个数据透视表pivottabler包裹 我想将数据透视表对象转换为数据框 以便我可以将其转换为数据表 带有 DT 并在 Shiny 应用程序中渲染它 以便可以下载 library pivottabler pt qpvt mt
  • R中的引用调用(使用函数修改对象)

    我刚刚接触 R 很惊讶地发现函数不会修改对象 至少看起来这是默认的 例如 我编写了一个函数 只是为了在表格中的一个标签上粘贴一个星号 它在函数内部工作 但表本身没有改变 我主要来自Ruby 那么 在 R 中使用函数更改对象的正常 可接受的方

随机推荐