我有一个spark数据框架,包括从不同来源获得的关于两种分子、调节器和目标(它们之间没有重叠)之间相互作用的数十亿个预测。我需要添加一列 包含预测给定“调节器”和给定“目标”的至少一个交互的数字资源。你知道吗
换句话说,对于每一对“调节器”和“目标”,我试图获得包含“调节器”和“目标”值的源的数量,即使在一次交互中没有配对。你知道吗
示例:
+---------+------+------+
|Regulator|Target|Source|
+---------+------+------+
| m| A| x|
| m| B| x|
| m| C| z|
| n| A| y|
| n| C| x|
| n| C| z|
+---------+------+------+
我想得到的是:
+---------+------+------+----------+
|Regulator|Target|Source|No.sources|
+---------+------+------+----------+
| m| A| x| 1|
| m| B| x| 1|
| m| C| z| 2|
| n| A| y| 2|
| n| C| x| 2|
| n| C| z| 2|
+---------+------+------+----------+
进一步说明:
第一行(m, A, x)
:
第二行(m, B, x)
:
第三行(m, C, z)
:
这里有一种解决这个问题的方法。为每行创建两个新列:
'RS'
:'Regulator'
的源集合'TS'
:'Target'
的源集合那么你想要的输出就是这些集合的交集的长度。你知道吗
考虑以下示例:
创建数据帧
创建新列
使用^{} 和^{} 计算
'Source'
列的不同值:计算交叉口的长度
定义一个
udf
来返回两个集合交集的长度,并使用它来计算'No_sources'
列。(注意,我在列名中使用了_
而不是.
,因为这样更容易使用select()
。)相关问题 更多 >
编程相关推荐