这是我的数据:
ID nb ecart
ID1 3 NA
ID1 3 0
ID1 3 1.5
ID2 2 NA
ID2 2 648
ID3 4 NA
ID3 4 0
ID3 4 0
ID3 4 7
我想计算每个 ID ==“0”的 ecart 数量的百分比。
nb 是显示每个 ID 的行数的变量。
超出的结果:
ID nb ecart percentage
ID1 3 NA NA
ID1 3 0 1/3
ID1 3 1.5 NA
ID2 2 NA NA
ID2 2 648 NA
ID3 4 NA NA
ID3 4 0 2/4
ID3 4 0 2/4
ID3 4 7 NA
希望尽快得到您的答复!谢谢!
最佳答案
快速高效 data.table
解决方案
library(data.table)
setDT(df)[ecart == 0L, percentage := round(.N / nb, 2L), by = ID]
# ID nb ecart percentage
# 1: ID1 3 NA NA
# 2: ID1 3 0.0 0.33
# 3: ID1 3 1.5 NA
# 4: ID2 2 NA NA
# 5: ID2 2 648.0 NA
# 6: ID3 4 NA NA
# 7: ID3 4 0.0 0.50
# 8: ID3 4 0.0 0.50
# 9: ID3 4 7.0 NA
这是如何工作的:这将修改
percentage
的值仅供引用 ecart == 0L
通过计算子组的大小(使用 .N
)除以 nb
或者(正如@CathG 所评论的),如果你想要一个漂亮的字符打印而不是一个数值,你可以这样做
setDT(df)[ecart == 0L, percentage := paste0(.N, "/", nb), by = ID]
或者,如果您更喜欢使用二元连接
setkey(setDT(df), ecart)[.(0L), percentage := paste0(.N, "/", nb), by = ID]
关于R:通过ID计算2列的商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31455806/