【问题标题】:How to count the number of monthly occurrences in a column and modify another column according to the results如何计算一列中每月出现的次数并根据结果修改另一列
【发布时间】:2019-09-03 08:27:42
【问题描述】:

我是 R 新手,但遇到了问题。我有一个包含超过 80000 个条目的 CSV 数据框。我有一列(maj)填充了 0 和 1,一列是一年中的每一天,一列是每天的价格(和其他列)。当 maj = 1 时,表示当天已完成价格更新。 我想做的是: 如果过去 30 天内 maj = 0,则必须将价格替换为“N/A”

这是我的 df 示例:

      day       maj     price
   2019-01-02    1      1435
   2019-01-03    0      1435
   2019-01-04    0      1435
   2019-01-05    0      1435

例如,如果在 2019-01-03 和 2019-02-03 之间,maj = 0,我想将 2019-02-04 和以下所有的价格替换为 N/A,直到 maj=再 1 次。

我没有任何代码要显示,因为当我看到没有任何工作时我将其删除。 我用 zoo 包尝试了 rollapplyr,它创建了一个函数和值来滚动每月总和,但我不明白。

有人知道怎么做吗?

谢谢,

【问题讨论】:

  • 欢迎来到 SO!您能否通过分享您的数据样本和您正在处理的代码来使您的问题可重现,以便其他人可以提供帮助(请不要使用str()head() 或屏幕截图)?您可以使用 reprexdatapasta 包来帮助您。另见Help me Help you & How to make a great R reproducible example?
  • 嗨,我试图粘贴我的剪贴板以显示 df 的示例,因为我没有设法使包工作。
  • 我不知道它是否适合您的情况,但也许值得将您的数据加载到 SQLite 数据库中。 db.rstudio.com/databases/sqlite
  • 请使用dput 命令生成您的数据:dput(df)
  • 嗨,@RafaelToledo 我试图这样做,但它根本不起作用,我的数据框出现但没有正确写入,所有内容都替换为数字和字母“L” .我不知道为什么。对不起。

标签: r if-statement count conditional-statements find-occurrences


【解决方案1】:

使用 DF 在最后的注释中可重现地显示,如果在最后 n 天内有任何 1,则使用 rollapplyr 返回 TRUE,否则返回 FALSE。然后使用ifelse 将TRUE 转换为1,将FALSE 转换为NA。该问题没有指定如何处理前 n-1 个元素,但下面我们用 1 填充它们。 (备选方案是 fill=NApartial=TRUE,如果少于 n,最后一个备选方案将适用于任何数量的元素。

library(zoo)

# n <- 30
n <- 3

transform(DF, price = price * ifelse(rollapplyr(maj, n, any, fill = 1), 1, NA))

给予:

         day maj price
1 2019-01-02   1  1435
2 2019-01-03   0  1435
3 2019-01-04   0  1435
4 2019-01-05   0    NA

注意

Lines <- "day       maj     price
2019-01-02    1      1435
2019-01-03    0      1435
2019-01-04    0      1435
2019-01-05    0      1435"
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE)
DF$day <- as.Date(DF$day)

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 2021-04-12
    • 1970-01-01
    • 2021-09-09
    • 2022-01-04
    • 1970-01-01
    • 2022-06-16
    • 2019-03-27
    • 1970-01-01
    相关资源
    最近更新 更多