计数两次出现和共生我想两个变量x
和y
,我在一个Spark数据帧,看起来像这样与计算mutual information(MI):在DF
scala> df.show()
+---+---+
| x| y|
+---+---+
| 0| DO|
| 1| FR|
| 0| MK|
| 0| FR|
| 0| RU|
| 0| TN|
| 0| TN|
| 0| KW|
| 1| RU|
| 0| JP|
| 0| US|
| 0| CL|
| 0| ES|
| 0| KR|
| 0| US|
| 0| IT|
| 0| SE|
| 0| MX|
| 0| CN|
| 1| EE|
+---+---+
在我的情况下, x
恰好是事件是否发生(x = 1
)或不是(x = 0
),而y
是国家代码,但这些变量可能代表任何事物。为了计算x
和y
之间的MI我想有通过x, y
双以下三个附加列编组上述数据框:
- 的
x
- 的
y
出现的次数出现的次数
- 的
x, y
出现在上面的短示例的数目,它看起来像
x, y, count_x, count_y, count_xy
0, FR, 17, 2, 1
1, FR, 3, 2, 1
...
然后,我只需要计算每个x, y
对的互信息项并对它们进行求和。
到目前为止,我已经能够按x, y
双和骨料count(*)
列,但我无法找到一个有效的方式来添加x
和y
计数。我目前的解决方案是将DF转换为数组并手动计算出现次数和共同出现次数。它在y
是一个国家时效果很好,但当y
的基数变大时需要永久使用。任何建议,我怎么能在更多Sparkish方式?
在此先感谢!
感谢您的回答。这个解决方案是我暂时使用的解决方案,但我不确定它是否会推广到y的基数为3或更大的情况。粗略地说,它包括明确地制作笛卡尔积(同时考虑'y'只能取两个值)。我认为@ z-star提出了一个更全面的答案。 但是,请不要删除您的答案,它仍然有效,可能对其他用户有用,其他用户可能会帮助您改进。 –