r - 在不汇总的情况下计算组中元素的出现次数
问题描述
我有如下所示的数据集:
x <- data.table(id=c(1,1,1,2,2,3,4,4,4,4), cl=c("a","b","c","b","b","a","a","b","c","a"))
我试图根据 cl 中的元素找到为每个组(id)选择一行的概率。
我尝试了以下方法:
x[,num:=.N, keyby=.(id,cl)]
x[,den:=.N, keyby=.(id)]
x[,prob:=num/den, ]
有一个更好的方法吗?
最终,我的最终目标是使用概率值作为权重,同时对每组(id)的一行进行采样。任何更好的选择来达到这些权重将不胜感激。
解决方案
你的意思是这样的吗?
> x[, prob := prop.table(table(cl))[cl], id][]
id cl prob
1: 1 a 0.3333333
2: 1 b 0.3333333
3: 1 c 0.3333333
4: 2 b 1.0000000
5: 2 b 1.0000000
6: 3 a 1.0000000
7: 4 a 0.5000000
8: 4 b 0.2500000
9: 4 c 0.2500000
10: 4 a 0.5000000
或者
> unique(x[, prob := prop.table(table(cl))[cl], id][])
id cl prob
1: 1 a 0.3333333
2: 1 b 0.3333333
3: 1 c 0.3333333
4: 2 b 1.0000000
5: 3 a 1.0000000
6: 4 a 0.5000000
7: 4 b 0.2500000
8: 4 c 0.2500000
解释:table
+prop.table
给出了所有元素的频率表,它们是命名值,因此我们用来[cl]
对频率进行子集化。
推荐阅读
- powershell - 在 PowerShell 中获取字符串的权利
- c# - 如何使用 c# 应用程序登录到我的路由器
- ios - 初始加载后是否可以将新 url 重新加载到 WKWebView 中?
- http2 - 在发送了 PUSH PROMISE 之后,服务器在获取推送的资产时应该发送什么错误?
- javascript - 是的,不同级别的条件验证
- reactjs - Reactjs按钮未触发
- powershell - Powershell 核心脚本仅在 pwsh 命令中运行
- azure - 将 Azure AD B2C 用户连接到我的数据库帐户的正确 Core 3.0 API 中间件?
- ssl - SSL 在所有主机上都失败。(SSL证书问题:证书链中的自签名证书)
- python - 如何为 .csv 文件中找到的每个重复条目创建一个新列表?