计算r中多个表列的出现百分比

计算r中多个表列的出现百分比,r,data.table,R,Data.table,我有一个表,如下所示-一些业务,一些他们可能参与的实践(P1-P4),以及一个名为“Peer”的列,它是一个分组列(yes-Peer,no-no Peer)。所有实践栏均为是/否: Business P1 P2 P3 P4 Peer a y n y n y b n n y n n c n y y n y d y y y y n e n n n y y f n n n

我有一个表,如下所示-一些业务,一些他们可能参与的实践(P1-P4),以及一个名为“Peer”的列,它是一个分组列(yes-Peer,no-no Peer)。所有实践栏均为是/否:

Business    P1  P2  P3  P4  Peer
a   y   n   y   n   y
b   n   n   y   n   n
c   n   y   y   n   y
d   y   y   y   y   n
e   n   n   n   y   y
f   n   n   n   y   n
g   y   y   n   n   y
h   n   y   n   n   n
i   n   n   y   n   y
j   y   n   y   y   n
k   n   y   y   y   n
l   n   y   y   y   n
m   y   n   n   n   n
n   n   n   n   n   y
o   n   y   n   n   y
p   y   y   n   y   n
q   n   n   y   y   y
r   n   n   y   y   n
s   y   y   y   n   y
t   n   y   y   n   y
u   n   n   n   n   y
v   y   n   n   y   n
w   n   y   n   y   n
x   n   y   n   y   y
y   y   n   y   n   n
z   n   n   y   n   y
我想从中获得的是一个汇总表,该表显示了以下内容,
百分比
是采取该做法的企业数量(做法=“y”):

注:我没有计算第二个表中的百分比,它们是由组成部分组成的

虽然我认为这应该可以通过data.table实现(特别相关),但我只能找出一种在我看来过于复杂的方法来创建这个表。P1的示例:

首先,计算这种做法在每个类别中出现的百分比:

P1Stats <- setDT(dtUptake)[order(Peer), .(P1 = unique(P1), percentage = 100 * tabulate(P1)/.N), by = Peer]

   Peer P1 percentage
1:    n  n   53.84615
2:    n  y   46.15385
3:    y  y   76.92308
4:    y  n   23.07692
将列
P1
的名称更改为
Practice

P1Stats <- P1Stats[, .(Peer, Practice = P1, percentage)]

   Peer Practice percentage
1:    n        y   46.15385
2:    y        y   76.92308
然后,如果我对我的每一个练习都执行此操作,我可以通过将它们拉到一起来创建最终的表。我知道我可以将三个最重要的步骤合并为一个步骤,然后再执行更新过程:


P1Stats使用
melt
data.table
by
参数,您可以实现这一点。例如,假设您的原始
数据.table
在变量
dt
中:

dt2 = melt.data.table(dt, id.vars=c('Business', 'Peer'), variable.name='practice')
dt2[,.(percentage=sum(value=='y')/.N*100), by=c('Peer','practice')]

by
操作将根据一列或一组列的值进行分组。由于原始数据中的值不是用于分组(P1、P2、P3、P4)的列值,而是分散在不同的列名中,因此由
melt
生成的长格式是一种方法。

谢谢。熔化操作工作得很好,但是计算百分比的第二部分返回一个错误:
列表中的错误(百分比=总和(值=“y”)/.N)*100:二进制运算符的非数字参数
。谢谢你们两位-现在工作得很好。在经历了20年的Excel和Access之后,R有点挣扎,它是一条学习曲线。但是很有趣。
P1Stats <- P1Stats[, .(Peer, Practice = P1, percentage)]

   Peer Practice percentage
1:    n        y   46.15385
2:    y        y   76.92308
P1Stats[, Practice := "P1"]

   Peer Practice percentage
1:    n       P1   46.15385
2:    y       P1   76.92308
dt2 = melt.data.table(dt, id.vars=c('Business', 'Peer'), variable.name='practice')
dt2[,.(percentage=sum(value=='y')/.N*100), by=c('Peer','practice')]