gpt4 book ai didi

r - 如何合并R中列表的重叠整数向量元素

转载 作者:行者123 更新时间:2023-12-04 17:09:48 28 4
gpt4 key购买 nike

我有一个向量列表:

l1 <- list(2:3, 4:5, 6:7, 8:9, 16:19, 15:19, 18:20, 20:21, 21:22, 
23:24, 23:25, 26:27, 30:31, 31:32, 33:34, 35:36, 38:39, 42:43,
44:45, 46:47, 50:51, 54:55, 55:56, 57:58, 59:60, 64:65, 66:67,
68:69, 69:70, 73:74, 77:78, 80:81, 82:83, 84:85, 88:89, 90:91,
92:93, 94:95, 96:97, 100:101, 103:104, 105:106, 107:108)

如果存在相互重叠的向量(包括),我需要将它们合并(因此减少列表的长度),以便覆盖尽可能广泛的范围。

例如取 l1 的前 7 个元素,
l1 <- list(2:3, 4:5, 6:7, 8:9, 16:19, 15:19, 18:20,...
我想把它变成:
l2 <- list(2:3, 4:5, 6:7, 8:9, 15:20,...
我怎样才能有效地做到这一点?

最佳答案

这是一个解决方案 - 首先调整每个向量的末端,使向量彼此相距稍远,然后取消列出并找到比 1 更近的所有条目:

# create a sorted vector adjusted end values
vec <- sort(unlist(lapply(l1, function(x) c(x[1] + 0.1,
head(tail(x, -1), -1),
tail(x, 1) - 0.1))))

# split vector if the difference between values is greater than 1
# then convert back to integer and remove the duplicates
lapply(split(vec, c(0, cumsum(diff(vec) > 1))), function(x) unique(round(x)))

结果:
$`0`
[1] 2 3

$`1`
[1] 4 5

$`2`
[1] 6 7

$`3`
[1] 8 9

$`4`
[1] 15 16 17 18 19 20 21 22

$`5`
[1] 23 24 25

$`6`
[1] 26 27

$`7`
[1] 30 31 32

$`8`
[1] 33 34

$`9`
[1] 35 36

$`10`
[1] 38 39

$`11`
[1] 42 43

$`12`
[1] 44 45

$`13`
[1] 46 47

$`14`
[1] 50 51

$`15`
[1] 54 55 56

$`16`
[1] 57 58

$`17`
[1] 59 60

$`18`
[1] 64 65

$`19`
[1] 66 67

$`20`
[1] 68 69 70

$`21`
[1] 73 74

$`22`
[1] 77 78

$`23`
[1] 80 81

$`24`
[1] 82 83

$`25`
[1] 84 85

$`26`
[1] 88 89

$`27`
[1] 90 91

$`28`
[1] 92 93

$`29`
[1] 94 95

$`30`
[1] 96 97

$`31`
[1] 100 101

$`32`
[1] 103 104

$`33`
[1] 105 106

$`34`
[1] 107 108

关于r - 如何合并R中列表的重叠整数向量元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21944232/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com