gpt4 book ai didi

r - 计算数据框中自开始以来的月数

转载 作者:行者123 更新时间:2023-12-02 09:28:43 25 4
gpt4 key购买 nike

我有一个数据框 df,其中包含来自一家汽车销售公司的数据。数据框包含特定日期的日期和销售数量。每个销售人员都有一个 staff_id。虚拟 inital_sell 表示哪一天是此人的第一个工作日。

现在我想添加一列 months_since_start,它为每一天添加此人开始工作以来的月份。然后我可以使用 sellsmonths_since_start 列绘制自销售人员开始工作以来每个月的平均销售量(每个销售人员第一个月的销售量,在第 2 个月...)。由于缺少某些日期和月份(例如,在示例底部所示的假期期间),我不能简单地添加一个序列来获取 months_since_start

date        year    month   staff_id   sells  initial_sell   months_since_start
2014-11-11 2014 11 1 3 1 1
2014-11-12 2014 11 1 1 0 1
2014-11-14 2014 11 1 1 0 1
2014-11-15 2014 11 1 2 0 1
...
2014-12-10 2014 12 1 2 0 1
2014-12-11 2014 12 1 1 0 2
...
2014-12-23 2014 12 2 1 1 1
2015-02-02 2015 2 2 4 0 2
2015-02-03 2015 2 2 1 0 2
...
2015-03-23 2015 3 2 3 0 4
...

谁能帮助我如何获得 month_since_start 列?

最佳答案

假设输入按 staff_iddate 排序,如问题中所示,并显示在注释的末尾。定义一个 months 函数,该函数为员工提供经过排序的日期向量,返回该成员自开始以来(即自第一个日期以来)的月份。然后使用 tapply 将其应用于每个员工。 tapply 返回按 staff_id 排序的列表,因此使用 unlist 解开它。没有使用包。

Months <- function(date) {
with(as.POSIXlt(date), 12 * (year - year[1]) + (mon - mon[1]) + (mday >= mday[1]))
}

transform(DF, months_since_start = unlist(tapply(date, staff_id, FUN = Months)))

给予:

         date year month staff_id sells initial_sell months_since_start
1 2014-11-11 2014 11 1 3 1 1
2 2014-11-12 2014 11 1 1 0 1
3 2014-11-14 2014 11 1 1 0 1
4 2014-11-15 2014 11 1 2 0 1
5 2014-12-10 2014 12 1 2 0 1
6 2014-12-11 2014 12 1 1 0 2
7 2014-12-23 2014 12 2 1 1 1
8 2015-02-02 2015 2 2 4 0 2
9 2015-02-03 2015 2 2 1 0 2
10 2015-03-23 2015 3 2 3 0 4

替代方案 使用ave 代替tapply 的替代方案如下。 Months 同上。 MonthsDF 调用 Months 但接受行号而不是日期本身。此解决方案仍然假定数据按 staff_id 中的 date 排序,但由于 ave 以与输入相同的顺序返回其输出,因此不需要按 staff_id 排序。 ave 的缺点是它不以这里需要的方式处理 "Date" 类数据,这就是我们使用行号作为 MonthsDF< 的输入的原因:

MonthsDF <- function(ix) Months(DF$date[ix])
transform(DF, months_since_start = ave(seq_along(date), staff_id, FUN = MonthsDF))

注意:使用了此输入:

Lines <- "date        year    month   staff_id   sells  initial_sell   
2014-11-11 2014 11 1 3 1
2014-11-12 2014 11 1 1 0
2014-11-14 2014 11 1 1 0
2014-11-15 2014 11 1 2 0
2014-12-10 2014 12 1 2 0
2014-12-11 2014 12 1 1 0
2014-12-23 2014 12 2 1 1
2015-02-02 2015 2 2 4 0
2015-02-03 2015 2 2 1 0
2015-03-23 2015 3 2 3 0"

DF <- read.table(text = Lines, header = TRUE)
DF$date <- as.Date(DF$date)

# in the question the input is already sorted by staff_id and date so
# the next two lines are not really needed but if we had non-sorted data
# then we should first sort it like this to be in the same form as in question
o <- with(DF, order(staff_id, date))
DF <- DF[o, ]

关于r - 计算数据框中自开始以来的月数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35398290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com