如何通过从另一个data.table连接到列来查找百分比值

时间:2016-10-21 09:52:08

标签: r join data.table

我已经构建了一个data.table数据帧dt1,如:

State Bounced Opened Delivered
FL    2       1      0
NY    0       1      1

我还有另一个data.table dt2,总值为:

State Total
NY    2
FL    3   

我想在第一个数据表中找到每列的百分比频率:

State Bounced Opened Delivered
FL    66.66   33.33  0
NY    0       50     50

如果我只是* 100并将所有第一个数据表除以第二个数据表的Total列,我得到了结果,但第一列的状态名称变为NA,这是不好的。

如果我喜欢:

dt1[, percen:=Bounced/dt2$Total]

它有效,但我必须为所有列重复该过程。有没有办法复制到所有列,但第一个?

第二个问题:检查所使用的总价值是否合适的最佳方法是什么 - 即属于正确的状态?到目前为止,我所做的只是按字母顺序排列State列,但我想知道data.table是否提供了一种在执行百分比时控制它的方法......

2 个答案:

答案 0 :(得分:2)

这是一个连接操作,所以使用data.table连接语法,它是一个单行:

dt1 <- data.table(State=c('FL','NY'), Bounced=c(2,0),
                  Opened=c(1,1), Delivered=c(0,1), key='State')
dt2 <- data.table(State=c('NY','FL'), Total=c(2,3), key='State')

colsToDivide = c('Bounced','Opened','Delivered')

dt1[dt2, (colsToDivide) :=
  lapply(mget(colsToDivide), function(x) {100*x/Total} ) ]

#   State  Bounced   Opened Delivered
#1:    FL 66.66667 33.33333         0
#2:    NY  0.00000 50.00000        50

答案 1 :(得分:0)

我对data.table不太满意,但是,我认为这样可行。

cbind(State = df1$State, 
      df1[, -1, with = FALSE]/df2$Total[match(df1$State, df2$State)]* 100)

#   State  Bounced   Opened  Delivered
#1:    FL  66.667    33.333         0
#2:    NY  0.000     50.000        50

考虑df1df2data.table

这也可以回答您的第二个问题match State df1 df2INSERT INTO group_msg_response (license_id,grp_id) VALUES (1,1) WHERE NOT EXISTS (SELECT 1 FROM group_msg_response WHERE license_id=1 AND grp_id=1 ) 的问题。