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

R 通过计算每个ID的百分比来制作表格,r,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

以下是我的数据:

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显示每个ID的值的数目

我想通过计算value==0,0的百分比得到一个表,您可以使用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
数据
因此,它不是一个代码编写服务。您尝试过哪些不起作用的方法?@hrbrmstr我尝试过setDTdf[,p1:=lengthv==0/.N,by=.ID],但它不起作用work@MamounBenghezal我觉得休息时需要一些改变。我只是在尝试OP的例子。为什么我们需要[c1,4]?@velvetrock我正在对数据集进行子集设置,以便只包括第一个和第四个column@MamounBenghezal对不起,标签上有什么问题?这是OP要求的。但是如果我有超过4个ID,比如1000,我应该将其更改为[C11000]
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[] <- 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))