我已经构建了一个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是否提供了一种在执行百分比时控制它的方法......
答案 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
考虑df1
和df2
是data.table
。
这也可以回答您的第二个问题match
State
df1
df2
与INSERT 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 )
的问题。