gpt4 book ai didi

r - 如何识别 'to' 和 'from' 位置未涵盖的所有序列号?

转载 作者:行者123 更新时间:2023-12-04 11:43:23 26 4
gpt4 key购买 nike

我有一个数据表,它定义了一组序列的开始和结束坐标。例如:

df1 <- data.frame(from = c(7, 22, 35, 21, 50),
to = c(13, 29, 43, 31, 60))

给定开始和结束坐标(即 1 和 100),我试图用相同的输出格式识别序列未涵盖的所有整数。例如:
df2 <- data.frame(from = c(1, 14, 32, 44, 61),
to = c(6, 20, 34, 49, 100))

这是我目前的尝试,其中我对 df1 中的序列进行矢量化,然后识别与序列 1:100 不匹配的所有整数。
seq2 <- Vectorize(seq.default, vectorize.args = c("from", "to"))
seq <- c(1:100)
df1_int <- unlist(seq2(from = df1$from, to = df1$to))
df1_int <- unique(df1_int)
df2_int <- seq[!seq %in% df1_int]
all(diff(df2_int) == 1)

但是,这种方法对于我想将其应用于(~100,000,000 个整数)的数据集来说太慢了,而且我不知道如何将向量 df2_int 重新格式化为 df2 格式的数据帧。

任何帮助将不胜感激!

注意:df1 中的序列并不总是以最小的整数开始(例如,序列可以从 13 到 7,而不是从 7 到 13)。也可能存在只有一个整数的序列(例如,从 7 到 7)。

最佳答案

编辑:应该更好地阅读问题。这基本上是您当前的方法。

您可以 pmap使用 seq 覆盖您的输入函数,和 unlist以获得所有值的向量。然后setdiff获取缺失值。使用 diffcumsum您可以为缺失值创建一个分组变量,将它们分组为 from-to 对。然后通过分组 var 和 map 分割缺失值向量为每个组创建一行输出。

library(purrr)

miss <- setdiff(1:100, unlist(pmap(df1, seq)))
i <-
miss %>%
diff %>%
`>`(1) %>%
rev %>%
cumsum %>%
rev

map_df(split(miss, c(i, 0)), ~list(from = head(.x, 1), to = tail(.x, 1))) %>%
dplyr::arrange(from)


# # A tibble: 5 x 2
# from to
# <int> <int>
# 1 1 6
# 2 14 20
# 3 32 34
# 4 44 49
# 5 61 100

关于r - 如何识别 'to' 和 'from' 位置未涵盖的所有序列号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55711684/

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