这是我的数据:
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的ID
,value==0
和0<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
,但它不起作用。
希望尽快得到答案!
答案 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))