计算r中多个表列的出现百分比
我有一个表,如下所示-一些业务,一些他们可能参与的实践(P1-P4),以及一个名为“Peer”的列,它是一个分组列(yes-Peer,no-no Peer)。所有实践栏均为是/否:计算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
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')]