我们如何在R中的两个表之间执行条件检查

时间:2017-03-24 08:07:50

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

假设我考虑两个表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

现在我的问题是,如何查找amount表格中的transaction是否大于transavg表中每个account的{​​{1}}。

并将其存储在变量中,如果大于account_id,则因子为1;如果小于transavg则为0。我需要使用哪些包。

2 个答案:

答案 0 :(得分:4)

我们可以使用match来比较account_id,然后从amount表中获取相应的account,然后将其与amount进行比较transaction 1}}表。这将返回一个布尔输出,可以使用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

答案 1 :(得分:2)

我们可以使用data.table的非等连接。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(transaction)),创建&#39;标记&#39;为0,加入&#39; amount&#39; on&#39; account_id&#39;和amount > transavg,并指定(:=)&#39;标记&#39;为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