在 R 中,我有以下数据框,其中“重叠”列列出了在其他列上有重叠值的行。
df <- data.frame(overlap = c("1,2,3", "1,2,3", "1,2,3,4", "3,4",
"5,6", "5,6,7", "6,7",
"8,9", "8,9,10", "9,10",
"11,12,13", "11,12,13",
"11,12,13,14", "13,14",
"15,16", "15,16,17", "16,17",
"18,19", "18,19,20", "19,20"))
df
overlap
1 1,2,3
2 1,2,3
3 1,2,3,4
4 3,4
5 5,6
6 5,6,7
7 6,7
8 8,9
9 8,9,10
10 9,10
11 11,12,13
12 11,12,13
13 11,12,13,14
14 13,14
15 15,16
16 15,16,17
17 16,17
18 18,19
19 18,19,20
20 19,20
我想识别具有共同值的行,即使这些值不存在于所有行中,然后只保留其中 1 行。例如,行 1-4 包含组合集 1,2,3,4,我想只保留其中一行。如果我们保留第一行,则生成的 df 将是:
1 1,2,3
5 5,6
8 8,9
11 11,12,13
15 15,16
18 18,19
我在这里搜索了许多其他解决方案,但没有一个包括不均匀的行长,这是至关重要的,因为完整数据可以包含具有数十个值的行。
对于此特定示例数据,一种选择是从行重叠中创建
igraph
图表,检测结果图中的连通分量,并使用分量的簇 ID 作为分组变量。从那里我们可以从每个组中挑选第一行。重叠图供参考:
我们可以尝试
{ivs}
:给予
vapply
有点多余,因为我们调用了好as.numeric
几次。你真的想将逗号分隔的整数存储为字符吗?给予
编辑
@Chris 在下面的评论中说得对。我应该添加一些解释。
(1)重新构造数据。拆分字符串,找到第一个和最后一个值,强制转换
character
为numeric
。给出
这显然假设最小整数在第一个位置,最大整数在最后一个位置——这是一个合理的假设吗?否则我们应该先强制转换为数字,然后应用于
range
每个列表元素。(2)为了创建区间向量,我们使用。摘自其文档(参见):
iv()
help(iv)
IE
最后,我们使用
iv_groups
。来自help(iv_groups)
:(3)看起来您想要的输出是一个字符向量,其中剩余间隔的所有整数序列粘贴在一起。
为了实现这一点,我们使用
ivs::iv_start()
和ivs::iv_end()
来访问每个间隔的边界。现在我们想生成规则序列。不幸的是,:
不是矢量化的,因此我们引入:toSpring()
是的包装器format()
,它的帮助页面状态将我们的自定义函数应用到每个开始和结束处得到
笔记
您也可以使用这个较短的版本。
我们使用一个技巧来利用来自基础的前向管道运算符。
这是一个
igraph
选项如果我们运行如下所示的虚拟数据集(与 OP 的数据示例略有不同,请参见第一个
overlap
值)我们将获得
OP 问题的原始数据(从
"1,2,3"
第一个值开始)给出