我已经建立了一个数据。
State Bounced Opened Delivered
FL 2 1 0
NY 0 1 1
和我有另一个数据。表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]
可以工作,但是我必须对所有列重复这个过程。是否有一种方法可以复制到除第一列以外的所有列?
第二个问题:检查使用的Total值是否正确(即属于正确的状态)的最佳方法是什么?到目前为止,我所做的只是按字母顺序排列State列,但我想知道数据是否。
这是一个连接操作,所以使用data。表连接语法,这是一行代码:
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
我不是很好与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
是df1
中的State
和dt1
0的CC_8。