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 measure A 1 measure A 2 measure B 1 measure B 2 1 8 25 23 5 4 5 2 8
  • 将函数应用于矩阵列表

    我有一个矩阵列表 注意 它们的维度与此示例不同 x lt matrix 1 10 ncol 2 y lt x 300 mylist lt list x y 我想运行一个函数networklevel在矩阵列表中的每个矩阵上 该函数有各种可以计
  • R:如何将描述小时、分钟和秒的非直观字符串转换为可行的 POSIXct 格式以执行标准算术?

    我在 R 中有一个数据集 其值采用小时 分钟和秒格式 然而 有些值只有小时和分钟 有些值只有分钟和秒 有些值只有分钟 有些值只有秒 它的格式也不是很有利 样本数据如下 example lt as data frame c 22h28m 17
  • 关于子组的新列和另一列中的百分比范围

    我有一个如下所示的示例 df df test lt data frame Group Name c Group1 Group2 Group1 Group2 Group2 Group2 Group1 Sub group name c A A
  • mlogit:需要 TRUE/FALSE 时缺少值

    我有来自离散选择实验 DCE 的数据 该实验研究了来自不同行业的个人的招聘偏好 我已经格式化为长格式 我想使用 mlogit 进行建模 我已导出数据 并且可以使用 asclogit 命令在 Stata 中成功运行模型 但在 R 中运行时遇到
  • 如何使用 ggplot2 对曲线下的区域进行着色

    我一直在尝试使用 ggplot2 生成类似于此 R 图形的绘图 xv lt seq 0 4 0 01 yv lt dnorm xv 2 0 5 plot xv yv type l polygon c xv xv lt 1 5 1 5 c y
  • 使用 2 个向量参数翻转函数

    我想对需要 2 个向量参数的函数应用滚动 这是使用 data table 的示例 不起作用 library data table df lt as data table cbind data frame x 1 100 y 101 200
  • 如何在R中将英尺转换为厘米?

    我得到了一个高度的字符向量 如下所示 859 5 10 5 8 5 11 6 0 5 10 6 2 5 11 6 2 6 2 5 7 5 9 5 7 6 1 6 0 5 11 6 0 6 5 6 1 6 1 5 10 5 11 5 11 6
  • 在防风草模型上使用 VIP 包计算重要性度量

    我正在尝试使用 vi firm 在防风草中制作的逻辑回归模型上计算特征重要性 对于正则表达式 我将使用 iris 数据集并尝试预测观察结果是否为 setosa iris1 lt iris gt mutate class case when
  • 如何在 R Markdown 中的内联 LateX 方程中输出 R 变量的值(即动态更新)

    我无法找到一种方法将 r 代码实现到 R markdown 中的内联 LateX 方程中 目标是如果变量 值 发生变化 则不必对它们的值进行硬编码 Given values lt c 1 4 2 5 7 9 avg lt sum value
  • R中使用余弦距离的层次聚类

    我想通过使用余弦相似度与 R 编程语言对文档语料库进行层次聚类 但出现以下错误 if is na n n gt 65536L stop 大小不能为 NA 或 超过 65536 需要 TRUE FALSE 时缺少值 我应该怎么办 为了重现它
  • 跨类别和列自动化卡方

    我有一个调查数据框 其中包含几个问题 列 编码为 1 同意 0 不同意 受访者 行 根据 年龄 年轻 中年 老年 地区 东 中 西 等指标进行分类 大约有30个类别总共 3个年龄 3个地区 2个性别 11个职业等 在每个指标中 类别不重叠且
  • 在 R 的替换命令中取消引用字符串

    我想知道是否可以unquote通过替换命令传递给表达式的字符串 具体来说 我使用 dplyr 从数据框中过滤和选择 gt w subject sex response 1 1 M 19 08 2 2 M 16 46 6 6 M 23 60
  • Shiny:从DT数据表中选定的行获取信息

    我们正在尝试重新创建示例 https demo shinyapps io 029 row selection https demo shinyapps io 029 row selection 使用DT包来渲染数据帧而不是shiny包 DT
  • 按组复制数据框

    我有以下数据框 df structure list Group c 1 1 1 1 2 2 2 2 2 2 3 3 3 index c 1 2 3 4 1 2 3 4 5 6 1 2 3 row names c NA 13L class c
  • Shiny :针对所有错误显示一条消息

    我在 R 的 Shiny 中有一个应用程序 我想处理消息 以便用户看不到发生了什么错误 我知道通过 tags style type text css shiny output error visibility hidden shiny ou
  • 构造奎因(自我复制功能)

    有没有人构建过 quine 生成自己源文本的副本作为其完整输出的程序 http www nyx net gthompso quine htm http www nyx net gthompso quine htm 在 R 中 quine 标
  • 如何对范围内的行进行分组并考虑第三列?

    我有一个遗传数据集 我想对基因组中物理上靠近的遗传变异 行进行分组 我想对每条染色体基因组中某些点范围内的基因进行分组 chrom 我的 点 数据集包含变体 行需要在一定范围内的位置 如下所示 chrom low high 1 500 17
  • 使用 data.table 左连接

    假设我有两个数据表 s dataA A B 1 1 12 2 2 13 3 3 14 4 4 15 dataB A B 1 2 13 2 3 14 我有以下代码 merge test merge dataA dataB by A all d
  • 在 R 中读入原始二进制数据并将其转换为整数

    我有一个二进制文件 其中包含编码为不同长度 主要是 2 4 字节 的有符号或无符号整数的数值 为了处理这些数据 我将文件的所需部分读取为raw向量与readBin 然后尝试将其转换为十进制 问题是 R的内置函数有限制 我不太明白 比如没有l

随机推荐