【问题标题】:How can we perform condition checking between two tables in R我们如何在 R 中的两个表之间执行条件检查
【发布时间】:2017-08-17 02:08:05
【问题描述】:

假设如果我考虑两个表 Transaction 和 account 其中transaction$account_id 包含account$account_id 中的因子和唯一值

> transaction
      trans_id account_id amount
             1        100    500
             2        101    200
             3        102    100
             4        100    600
             5        100    700
             6        100    900
             7        101   1000
             8        101  10000
             9        102  20000
            10        101   5000
> account
  account_id Total.amnt notrans transavg
         100       2700       4      675
         101      16200       4     4050
         102      20100       2    10050

现在我的问题是,对于每个account_id,如何查找transaction 表中的amount 是否大于account 表中的transavg

并将其存储在一个变量中,如果大于transavg,则为 1,如果小于transavg,则为 0。以及我需要使用哪些软件包。

【问题讨论】:

标签: r function if-statement data-manipulation r-package


【解决方案1】:

我们可以使用match比较account_id,然后从account表中得到对应的amount,再与transaction表中的amount比较。这将返回一个布尔输出,可以使用as.integer 将其转换为整数。

transaction$flag <- as.integer(transaction$amount > 
          account$transavg[match(transaction$account_id, account$account_id)])

transaction

#   trans_id account_id amount flag
#1         1        100    500    0
#2         2        101    200    0
#3         3        102    100    0
#4         4        100    600    0
#5         5        100    700    1
#6         6        100    900    1
#7         7        101   1000    0
#8         8        101  10000    1
#9         9        102  20000    1
#10       10        101   5000    1

【讨论】:

    【解决方案2】:

    我们可以对data.table 使用非等连接。将'data.frame'转换为'data.table'(setDT(transaction)),将'flag'创建为0,加入'amount'on'account_id'和amount &gt; transavg,并赋值(:=) “标志”为 1。

    library(data.table)
    setDT(transaction)[, flag := 0][amount, flag := 1, on =.(account_id, amount > transavg)]
    transaction
    #     trans_id account_id amount flag
    # 1:        1        100    500    0
    # 2:        2        101    200    0
    # 3:        3        102    100    0
    # 4:        4        100    600    0
    # 5:        5        100    700    1
    # 6:        6        100    900    1
    # 7:        7        101   1000    0
    # 8:        8        101  10000    1
    # 9:        9        102  20000    1
    #10:       10        101   5000    1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2020-11-07
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多