"分类值的百分比"在基于数据帧R的子集的一列中

时间:2016-05-11 23:51:14

标签: r

我的数据包含三列(例如)名为data $ engine,data $ unit和data $ Turn。 data $ Turn是分类变量,值为0,1和2.对于数据$ engine的每个唯一值,可以有多个数据值$ unit。

我想计算数据中的0,1和2的百分比$转向分别为唯一数据$ unit和data $ engine。我有十万行但我粘贴数据结构只有两个唯一值的数据$ engine ...请注意,每个数据$ unit(对于特定数据$ engine)可以有几千行,因而用于计算%age ,我想继续:

%age of 0's for data$unit 207 and data$engine 1111 = 
counts of all zeros within data$unit 207 and data$engine 1111 (DIVIDED BY) 
summation of all counts of 0, 1, and 2 for this data$unit and data$engine.*emphasized text*

Similarly for % ages of 1's and 2's for data$unit 207 and data$engine 1111, 
and it continues for all other values of units and engines....

data$engine  data$unit     data$AvailableLeft
    1111       207                1
    1111       207                0
    1111       207                2
    1111       207                0
    1111       207                0
    1111       207                2
    1111       207                0
    1111       207                1
    1111       208                0
    1111       208                1
    1111       208                2
    1111       208                1
    1122       209                2
    1122       209                2
    1122       209                0
    1122       209                0
    1122       209                1

我想以这种方式得到我的输出,即每个数据$ unit和每个数据$ engine的平均%年龄为0,1和2:

data$engine  data$unit     %age of 0s     %age of 1s    %age of 2s
 1111          207              ?              ?            ?
 1111          208              ?              ?            ?    
 1122          209              ?              ?            ?    
   .             .                    .
   .             .                    .
   .             .                    .

2 个答案:

答案 0 :(得分:1)

您可以使用data.table

library(data.table)
setDT(data)[, .(p0=sum(AvailableLeft==0)/.N, 
                p1=sum(AvailableLeft==1)/.N, 
                p2=sum(AvailableLeft==2)/.N), 
             keyby=.(data, engine, unit)]

   engine unit   p0   p1   p2
1:   1111  207 0.50 0.25 0.25
2:   1111  208 0.25 0.50 0.25
3:   1122  209 0.40 0.20 0.40

答案 1 :(得分:0)

library(data.table)
dt <- as.data.table(your_data)
dt[,.("p1"=paste(as.character(round(sum(data.AvailableLeft==1)*100/.N,2)),"%")),.(data.engine,data.unit)]

我会离开%的{​​{1}}和data.AvailableLeft==0 %,因为从这里弄清楚它们是微不足道的