我有一个完整的路径名列表,我想从最近的父目录中返回路径,该路径消除了文件路径的重复。
下面是一个示例(我将重复的文件分组在同一行上):
have <- c("/A/B/C/D", "/A/B/D", "/A/C/D",
"/path/to/unique_file",
"/path/to/another_unique_file",
"/path/diverges/here/file", "/path/diverges/here1/file")
我想得到的是:
want <- c("B/C/D", "B/D", "A/C/D",
"unique_file",
"another_unique_file",
"here/file", "here1/file")
> length(unique(want)) == length(have)
[1] TRUE
几个参数:
1.在这个例子中,我有3个D
、2个file
、1个unique_file
和1个another_unique_file
,但在我的实际问题中,可能有任意数量的重复文件名。
1.至少,整个路径名将是唯一的(正如您所期望的)。如果路径名是最短的(从右边算起)唯一路径,则可以返回完整的路径名。/A/B/C/D
将使第一个文件不同,但B/C/D
也使它不同,更短,这是我所需要的。
1.如第一组文件名所示,具有相同名称的文件可以嵌套在不同的深度。例如,D
分别位于第三、第二和第二个队列中。
1.我倾向于使用基R函数,除非有一个包可以使这个算法更容易阅读,代码更短。
使用split
很容易将它们分组:
> split(have, basename(have))
$another_unique_file
[1] "/path/to/another_unique_file"
$D
[1] "/A/B/C/D" "/A/B/D" "/A/C/D"
$file
[1] "/path/diverges/here/file" "/path/diverges/here1/file"
$unique_file
[1] "/path/to/unique_file"
从这里,我希望得到一些帮助,从文件名向后工作,直到路径是唯一的。我曾经考虑过递归函数,但我不确定它是否适用于不同的深度。
2条答案
按热度按时间tktrz96b1#
这里有一个非递归方法。它的工作原理是从尾部开始,寻找重复的尾部。一旦尾部是唯一的,就将其包含在结果中。
创建于2023-09-18带有reprex v2.0.2
s1ag04yj2#
您可以使用递归方法,用一个子例程查找唯一路径,用另一个子例程提取并格式化它们。这两个都可以封装在一个函数中:
测试,我们有
创建于2023-09-18带有reprex v2.0.2