【问题标题】:Mean of the values that have less than 10 months in stock库存少于 10 个月的值的平均值
【发布时间】:2018-11-19 11:46:02
【问题描述】:

所以我有一个数据表 (dt),其中包含以下元素、一个 Item 的 id、当天的日期和库存。

ID        date             Stock
193sd      2016-03-23        12
238ds      2016-04-20         1
193sd      2017-09-12         1
...

例如,像 193sd 这样的 ID 有不同的日期

ID        date             Stock
193sd    2016-03-23          12
193sd    2017-09-12          1
193sd    2018-09-11          4
193sd    2017-01-12          2
193sd    2016-02-11          1

我需要从 10 个月前的最新日期开始查找股票的平均值,我知道我应该手动执行以下操作:

对于那个 ID 193sd

  1. 将 dt$date 从最新到最旧排序
  2. 获取 M 日期(i)和日期(i+1)之间的月数

    dates=c(dateNew, dateOld) dates2 <- strptime(dates, format = "%Y-%m-%d") dif <- diff(as.numeric(dates2)) # difference in seconds months = dif/(60 * 60 * 24 * 30) # months

  3. 检查 M

  4. 如果为真,则查找该 ID 的这些日期的股票平均值并完成

    平均值是 dt$stock 的值的总和除以 10

  5. 如果错误重复

作为其他语言的程序员和 R 的新手,我总是想到 for 循环,但我确信在使用数据表时有更好的清洁方式。

【问题讨论】:

  • 你能说得更具体些吗...你是把更多的问题组合成一个问题还是做出不同的事情?
  • 问题很清楚 找到 10 个月的库存平均值,但我正在尝试添加尽可能多的细节和方法
  • 每月或每个 id 或组合的平均库存?
  • 显然对于每个 ID

标签: r data.table


【解决方案1】:

使用 data.tablelubridate 包,您可以执行以下操作

library(data.table); library(lubridate);

df <- read.table(text = 
"ID      date                Stock
193sd    2016-03-23          12
193sd    2017-09-12          1
193sd    2018-09-11          4
193sd    2018-01-12          NA
193sd    2017-12-11          1", header = T, stringsAsFactors = F)

dt <- as.data.table(df) 
dt[, date := as.Date(date)]
result <- dt[, .SD[date >= max(date) %m-% months(10)], by = ID][, .(customMean = sum(Stock, na.rm = T)/10), by = ID] #calculate the mean stock as you described for entries in date that are within 10 months from the last date for each ID
##      ID customMean
##1: 193sd        0.5

【讨论】:

  • 这看起来不错,但我得到错误 sum("Stock") 中的错误:我相信参数的“类型”无效(字符),因为我有 NAs
  • inn 为了得到不包括 NA 的总和,你应该这样做 sum(..., na.rm = T),正如你现在在编辑中看到的那样
  • 我刚刚检查并result 给定 10 个月的 certian ID 有 120 条记录,所以这 120 条记录的平均值应该不同 ??
  • 您能提供更多数据吗?对前 100 行数据进行 dput 并将其粘贴到上方进行编辑
  • 让我们继续聊天
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多