data.table join + update with mult='first' 给出了意想不到的结果

2023-12-24

在下面的示例中,我有一个用户表和一个事务表,其中一个用户可以有 0 个、1 个或多个事务。我执行连接+更新mult='first'在 users 表上尝试插入一列,指示每个用户第一次发生事务的日期。

library(data.table)  # v1.10.4

# Download data
users <- fread("https://raw.githubusercontent.com/ben519/DataWrangling/master/Data/users.csv")
transactions <- transactions <- fread("https://raw.githubusercontent.com/ben519/DataWrangling/master/Data/transactions.csv")

# Convert date columns to Date type
    users[, `:=`(Registered = as.Date(Registered), Cancelled = as.Date(Cancelled))]
    transactions[, TransactionDate := as.Date(TransactionDate)]

users
   UserID     User Gender Registered  Cancelled FirstTransactionDate
1:      1  Charles   male 2012-12-21       <NA>           2012-08-26
2:      2    Pedro   male 2010-08-01 2010-08-08           2013-12-23
3:      3 Caroline female 2012-10-23 2016-06-07           2016-05-08
4:      4  Brielle female 2013-07-17       <NA>                 <NA>
5:      5 Benjamin   male 2010-11-25       <NA>                 <NA>

transactions
    TransactionID TransactionDate UserID ProductID Quantity
 1:             1      2010-08-21      7         2        1
 2:             2      2011-05-26      3         4        1
 3:             3      2011-06-16      3         3        1
 4:             4      2012-08-26      1         2        3
 5:             5      2013-06-06      2         4        1
 6:             6      2013-12-23      2         5        6
 7:             7      2013-12-30      3         4        1
 8:             8      2014-04-24     NA         2        3
 9:             9      2015-04-24      7         4        3
10:            10      2016-05-08      3         4        4

##### For each user, insert the TransactionDate of the first matching row
users[transactions, FirstTransactionDate := i.TransactionDate, on="UserID", mult="first"]

# Unexpected result
users[UserID == 2]
   UserID  User Gender Registered  Cancelled FirstTransactionDate
1:      2 Pedro   male 2010-08-01 2010-08-08           2013-12-23  # <- shouldn't this be 2013-06-06?

为什么 FirstTransactionDate2013-12-23当交易表中较早的交易与用户 2 绑定时,是否为该用户设置?这是一个错误吗?


阅读文档data.table's mult更仔细地说,它说:

When i is a list (or data.frame or data.table) 和多行x与中的行匹配i, mult返回的控件:"all"(默认),"first" or "last".

所以如果有多行x(“用户”)匹配i(“交易”),那么mult将返回第一行x。但是,在您的情况下,中没有多行x匹配到i,而是有多行i匹配到x.

正如@Arun建议的,最好的选择是改变你的周围,这样mult = "first"是相关的:

users[, FirstTransactionDate := transactions[users, TransactionDate, on="UserID", mult = "first"]]

users
#   UserID     User Gender Registered  Cancelled FirstTransactionDate
#1:      1  Charles   male 2012-12-21       <NA>           2012-08-26
#2:      2    Pedro   male 2010-08-01 2010-08-08           2013-06-06
#3:      3 Caroline female 2012-10-23 2016-06-07           2011-05-26
#4:      4  Brielle female 2013-07-17       <NA>                 <NA>
#5:      5 Benjamin   male 2010-11-25       <NA>                 <NA>

另一种选择是稍微改变你的合并:

users[transactions[,FirstTransactionDate := min(TransactionDate), by = UserID],
      FirstTransactionDate := FirstTransactionDate, on="UserID"]

我只是在其中创建第一个交易日期transactions数据集。这会被合并多次,但应该没问题,因为它始终是相同的值UserID.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

data.table join + update with mult='first' 给出了意想不到的结果 的相关文章

  • 线性判别分析图

    如何将样本 ID 行号 作为标签添加到此 LDA 图中的每个点 library MASS ldaobject lt lda Species data iris plot ldaobject panel function x y points
  • 从 csv 文件中读取奇数行

    这看起来相当简单 我只需要从 R 中的数据文件中读取奇数行并创建一个新的数据框 我怎样才能实现这个目标 read csv filename csv c TRUE FALSE 怎么运行的 功能read csv用于读取整个文件并返回包含所有行的
  • 删除字符串中的转义符,或者“我怎样才能让 \ 不碍事?”

    转义字符在 R 中会带来很多麻烦 前面的问题证明了这一点 更改列中的值 https stackoverflow com questions 10046357 change the values in a column 10046412 10
  • 以给定的纵横比保存绘图

    我正在使用非常棒的库 ggplot2 我想出了如何使用设置绘图的纵横比coord fixed 现在 我想将绘图保存为具有指定宽度 例如 10 厘米 的 PDF 并计算所需的高度 我不知道如何实现这一目标 这可能吗 您可以使用网格函数来计算
  • R:如何应用输出多列数据帧的函数(使用 dplyr)?

    我想查找数据框中某一特定列与所有其他列之间的相关性 p 值和 95 CI broom 包提供了一个示例 说明如何使用带有 dplyr 和管道的 cor test 在两列之间执行此操作 对于 mtcars 和 mpg 列 我们可以与另一列进行
  • 为什么 statsmodels 和 R 的逻辑回归结果不同?

    我正在尝试比较 python 的 statsmodels 和 R 中的逻辑回归实现 Python版本 import statsmodels api as sm import pandas as pd import pylab as pl i
  • R:大向量的高效迭代子集和过滤

    我想更快地执行以下操作 Logic 我有一个向量big共 4 个元素1 2 3 4 我还有一个相同长度的阈值向量1 1 3 1 4 1 5 1 我希望每个元素找到第一个元素的索引next元素高于相应的阈值 在这种情况下 我的预期输出是 2
  • dplyr / left_join 中的嵌套管链

    在尝试获取分组滞后变量的过程中 仅使用这是不可能的 lag 建议的解决方案是将数据拉出 滞后不同的行 然后重新加入它 我更喜欢在不创建中间对象的情况下执行此操作 并且希望在链中间执行此操作 然而 它似乎没有像我预期的那样工作 问题似乎是使用
  • R - 在浏览器中获取帮助而不是内置的 R 帮助程序

    我见过 R help 的两种不同行为 当你输入 density例如 帮助已在您的默认浏览器中打开 帮助在内置 R 帮助程序中打开 R 中的窗口 我目前有第二种行为 但我想在浏览器中打开帮助 我可以轻松地在这两种行为之间切换吗 无需重新安装
  • 在 Shiny 中设置一个绘图缩放以匹配另一个绘图缩放

    我正在尝试使用情节重排获取一个图的 x 轴缩放限制 并将它们应用到 Shiny 中的另一个图 到目前为止 我可以从 plot1 x轴限制 获取相关的plotly relayout数据 将其转换 从数字到日期 并在绘制 plot2 之前将其提
  • 如果“testthat”测试在“R”中失败,则打印自定义诊断信息

    I use a testthat单元测试来检查是否data frame函数返回的结果与我期望它返回的结果相同 如果测试失败 testthat打印一些诊断信息 例如 MyFunction df orig is not identical to
  • 如何生成向量的所有组合[重复]

    这个问题在这里已经有答案了 假设我有 3 个绿球 2 个橙球和 8 个黄球 我想订购它们 鉴于所有相同颜色的球都是相同的 如何生成所有可能的序列 在 R 中 使用gregmisc 我可以 balls lt c orange orange g
  • 如何调整ggplot直方图的时间刻度轴

    我正在使用一个数据框 其中一列包含POSIXct日期时间值 我正在尝试使用绘制这些时间戳的直方图ggplot2但我有两个问题 我不知道如何设置 binwidthgeom histogram 我想将每个垃圾箱设置为一天或一周 我尝试提供 di
  • 用于清除工作空间和转储存储的 R 全局函数

    我希望创建一个全局函数来清除我的工作区并转储我的内存 我将我的函数称为 cleaner 并希望它执行以下代码 remove list ls gc 我尝试在全局环境中创建该函数 但是当我运行它时 控制台仅打印该函数的文本 在我要获取的函数文件
  • R-了解 akima::interp 结果中的 NA 值

    我有以下数据框 ref dat k Intensity Slope 1 0 021467214 33 16 2 0 012444759 33 8 3 0 006079156 33 4 4 0 003792025 33 2 5 0 02276
  • 如何使用 R 中带引号的字符值内的序列读取 CSV?

    这是一个包含两个字符列的 CSV 文件 key value a 所有字符值都用双引号引起来 并且有一个顺序 在值之一内 转义引号加分隔符 我无法通过 read csv readr 中的 read csv 或 data table 中的 fr
  • C# 优化:向数据库插入 2 亿行

    我有以下 简化的 代码 我想优化速度 long inputLen 50000000 50 million DataTable dataTable new DataTable DataRow dataRow object objectRow
  • 使用 dplyr:group_by 将数据帧分成多个子集?

    有没有办法根据 group by 组使用 dplyr 将一个数据帧拆分为数据帧的子集 mtcars gt group by cyl gear gt codes 非常感谢 好吧 并不是你真的想要 但你可以这样做tidyr 即nearly一样的
  • 如何在 R 中为传单中的数值变量设置不对称颜色渐变

    我想让传单调色板以零为中心 红白绿发散 我已经尝试过中所说的这个帖子 https stackoverflow com questions 29262824 r center color palette on 0 当我尝试手动创建颜色时 我得
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac

随机推荐