通过计算每个ID的百分比来制作表格

时间:2015-07-20 12:07:54

标签: r

这是我的数据:

ID      nb     value    
ID1     3       1  
ID1     3       0    
ID1     3       1.5 
ID2     2       12 
ID2     2       648 
ID3     4       7
ID3     4       0  
ID3     4       0 
ID3     4       7
ID4     2       146
ID4     2       3  

nb显示每个value的{​​{1}}个数。

我想通过计算每个ID的IDvalue==00<vlaue<6的百分比得到一个表格,预期结果为:

value>=6

我尝试了ID value=0 0<vlaue<6 value>=6 ID1 1/3 2/3 0 ID2 0 0 2/2 ID3 2/4 0 2/4 ID4 0 1/2 1/2 ,但它不起作用。

希望尽快得到答案!

1 个答案:

答案 0 :(得分:2)

您可以使用cut创建群组,然后在列的子集上尝试table,即。 'ID'和'grp'栏。

tbl <- table(transform(df1, grp=cut(value, breaks=c(-Inf, 0, 6.0001, Inf), 
           labels=c('value=0', '0<value<6', 'value>=6')))[c(1,4)])
res <- prop.table(tbl,1)
res
 #       grp
 #ID      value=0 0<value<6  value>=6
 #  ID1 0.3333333 0.6666667 0.0000000
 #  ID2 0.0000000 0.0000000 1.0000000
 #  ID3 0.5000000 0.0000000 0.5000000
 #  ID4 0.0000000 0.5000000 0.5000000

如果你需要'分数'

 library(MASS)
 fractions(res)
 #    grp
 #ID    value=0 0<value<6 value>=6
 #    ID1 1/3     2/3         0     
 #    ID2   0       0         1     
 #    ID3 1/2       0       1/2     
 #    ID4   0     1/2       1/2     

或者从'tbl',我们也可以paste获得预期的输出,如OP的帖子所示

 tbl[] <- ifelse(tbl==0, 0, paste0(tbl, '/', rowSums(tbl)))
 tbl
 #   grp
 #ID  value=0 0<value<6 value>=6
 # ID1 1/3     2/3       0       
 # ID2 0       0         2/2     
 # ID3 2/4     0         2/4     
 # ID4 0       1/2       1/2     

数据

 df1 <- structure(list(ID = c("ID1", "ID1", "ID1", "ID2", "ID2", "ID3", 
 "ID3", "ID3", "ID3", "ID4", "ID4"), nb = c(3L, 3L, 3L, 2L, 2L, 
 4L, 4L, 4L, 4L, 2L, 2L), value = c(1, 0, 1.5, 12, 648, 7, 0, 
 0, 7, 146, 3)), .Names = c("ID", "nb", "value"), class = "data.frame",
 row.names = c(NA, -11L))