【问题标题】:Create loyalty variable in R by subtracting 2 date variables. Problem with getting the total amount of years. Football data通过减去 2 个日期变量在 R 中创建忠诚度变量。获取总年数的问题。足球数据
【发布时间】:2022-07-11 20:44:59
【问题描述】:

我目前在一家荷兰足球俱乐部工作,在获取某些球迷的关系长度时遇到了一些问题。在下面的图片中,简要概述了一位球迷及其随时间购买的季票。 membershipJoinDate 表示粉丝加入俱乐部的时间,但是在计算忠诚度时,会使用加入日期和结束日期之间的差值,使用以下代码:

dfmembership_season1$Loyalty_days <- difftime(dfmembership_season1$MembershipEndDate ,dfmembership_season1$MembershipJoinDate , units = c("days"))
dfmembership_season1$Loyalty_years <- interval(dfmembership_season1$MembershipJoinDate, dfmembership_season1$MembershipEndDate) %>%
  as.period() %>%
  year()

我根据他购买的产品来建立粉丝的忠诚度。但是我想计算这个变量中的整体忠诚度,从他成为俱乐部成员的第一个日期开始。我尝试了以下方法:

dfmembership1$loyalty_year <- dfmembership1 %>%
  group_by(GroupID) %>%
  mutate(loyalty_year = MembershipEndDate - MembershipJoinDate, default = first(MembershipJoinDate), order_by = GroupID)

但我得到了错误: mutate() 中的错误: !计算 loyalty_year = MembershipEndDate - MembershipJoinDate 时出现问题。 ℹ 组 1 出现错误:GroupID = 302339。 由MembershipEndDate - MembershipJoinDate 中的错误引起: !二元运算符的非数字参数 运行rlang::last_error() 看看哪里出错了。

有人有解决办法吗?

对于 dput() 数据来重建数据集: 结构(列表(MembershipType = c(“Seizoenkaart”,“Seizoenkaart”, “Seizoenkaart”,“Seizoenkaart”,“Seizoenkaart”,“Seizoenkaart”, “Seizoenkaart”,“Seizoenkaart”,“Seizoenkaart”,“Seizoenkaart”, “Seizoenkaart”,“Seizoenkaart”,“Seizoenkaart”,“Seizoenkaart” ), 交易价格 = c(0, 211, 206, 0, 0, 0, 209, 0, 0, 219, 206, 211, 214, 209), MembershipJoinDate = structure(c(17348, 16983、16252、18078、18078、17713、16252、17713、17348、18078、 16252, 17348, 17713, 16252), class= "日期"), MembershipEndDate = structure(c(18443, 17347、17347、18808、18808、18443、17347、18443、18443、18808、 17347, 18443, 18443, 17347), class= "日期"), GroupID = c(100041615L, 100041615L, 100041615L, 100041615L, 100041615L, 100041615L, 100041615L, 100041615L, 100041615L, 100041615L, 100041615L, 100041615L, 100041615L, 100041615L), Loyalty_days = 结构(c(1095, 364, 1095, 730, 730, 730, 1095, 730, 1095, 730, 1095, 1095, 730, 1095), class= "difftime", 单位 = "days"), Loyalty_years = c(3, 1, 3, 2, 2, 2, 3, 2, 3, 2, 3, 3, 2, 3)), row.names = c(25162L, 25163L, 25164L, 25165L, 25166L, 25167L、25168L、25169L、25170L、25171L、25172L、25173L、25174L、 25733L), class= "data.frame")

Example of data

【问题讨论】:

  • 你能提供一些使用dput()的示例数据吗?这样会更容易为您提供帮助。
  • 刚刚做到了!对不起,我是堆栈溢出的新手。
  • 顺便修复了错误,通过:dfmembership2$MembershipJoinYear
  • 只用年份制作变量,使它们成为数字,但是忠诚度变量还不是正确的,有负的忠诚度分数,这是错误的..知道怎么做吗?
  • 太棒了。检查我的答案,看看我是否正确理解了你的问题。否则,请提供此数据样本的预期输出

标签: r


【解决方案1】:

如果我理解正确,您想计算从用户的第一个MembershipJoinDate 到当前行的MembershipEndDate 的时间间隔。这是一种方法。

library(dplyr)
library(lubridate)

dfmembership_season1 %>%
  group_by(GroupID) %>%
  mutate(Loyalty_days = MembershipEndDate - min(MembershipJoinDate),
         Loyalty_years = time_length(Loyalty_days, unit = 'years')) %>%
  ungroup()

#> # A tibble: 14 × 7
#>    MembershipType TransactionPrice MembershipJoinDate MembershipEndDate   GroupID Loyalty_days Loyalty_years
#>    <chr>                     <dbl> <date>             <date>                <int> <drtn>               <dbl>
#>  1 Seizoenkaart                206 2014-07-01         2017-06-30        100041615 1095 days             3.00
#>  2 Seizoenkaart                209 2014-07-01         2017-06-30        100041615 1095 days             3.00
#>  3 Seizoenkaart                206 2014-07-01         2017-06-30        100041615 1095 days             3.00
#>  4 Seizoenkaart                209 2014-07-01         2017-06-30        100041615 1095 days             3.00
#>  5 Seizoenkaart                211 2016-07-01         2017-06-30        100041615 1095 days             3.00
#>  6 Seizoenkaart                  0 2017-07-01         2020-06-30        100041615 2191 days             6.00
#>  7 Seizoenkaart                  0 2017-07-01         2020-06-30        100041615 2191 days             6.00
#>  8 Seizoenkaart                211 2017-07-01         2020-06-30        100041615 2191 days             6.00
#>  9 Seizoenkaart                  0 2018-07-01         2020-06-30        100041615 2191 days             6.00
#> 10 Seizoenkaart                  0 2018-07-01         2020-06-30        100041615 2191 days             6.00
#> 11 Seizoenkaart                214 2018-07-01         2020-06-30        100041615 2191 days             6.00
#> 12 Seizoenkaart                  0 2019-07-01         2021-06-30        100041615 2556 days             7.00
#> 13 Seizoenkaart                  0 2019-07-01         2021-06-30        100041615 2556 days             7.00
#> 14 Seizoenkaart                219 2019-07-01         2021-06-30        100041615 2556 days             7.00

reprex package (v2.0.1) 于 2022-05-13 创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多