【问题标题】:Find each combination of values from a list of ranges in R从 R 中的范围列表中查找值的每个组合
【发布时间】:2017-10-01 07:53:41
【问题描述】:

我正在 R 中进行动态网络分析,并且我有一个日期范围列表作为数据框中的两列。我试图弄清楚如何创建一个全面的数据框/列表,其中包含每个范围内每个日期的每个可能的唯一组合。日期范围的长度都不同。

例如:

Date1    Date2
1275     1277
1301     1303
1290     1291

我想创建一个数据框或列表,其中每个列/项目代表每个范围内的唯一可能的日期组合:

1      2      3      4      5      6      7...........?
1275   1276   1277   1275   1275   1275   1276........1277
1301   1301   1301   1302   1303   1302   1202........1303
1290   1290   1290   1290   1290   1291   1290........1291

我对 java 的直觉是转向嵌套循环,但避免循环就像 R 的重点,所以我觉得我的直觉一定是错误的。

基于 R- all pairwise combinations of elements from two listsCalculating all possible combinations within a range in R 我已经破解了这个

makeAllDateCombos <- function(earlydatecolumn, latedatecolumn){
  allDCs <- NULL
  allDCs <- as.data.frame(lapply(earlydatecolumn, function(earlydatecolumn){
    lapply(latedatecolumn, function(latedatecolumn){
      (table(earlydatecolumn:latedatecolumn))
      })
  }))
  return(allDCs)
}

allTheDCs <- makeAllDCs(collab_dates$Date1, collab_dates$Date2)

但是这会返回错误。

Error in data.frame(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,  : 
  arguments imply differing number of rows: 16, 27, 6, 21, 26, 1, 5, 4, 31, 11, 18, 13, 15, 23, 17, 7, 10, 9, 24, 19, 33, 20 

【问题讨论】:

  • t(do.call(expand.grid, mapply(seq, Date1, Date2, SIMPLIFY = FALSE))) 可能会起作用。
  • 这绝对是在正确的轨道上。 mapply(seq...) 有效,但 do.call(expand.grid, ...) 使 rstudio 崩溃。
  • @r2evans 感谢您的建议。使用一小部分范围(小于 5),您的解决方案可以完美运行,因此如果您想将其作为答案提交,我会接受它。以我拥有的内存量,我需要找到另一个解决方案,也许是总排列的子样本,以弄清楚约会的变化如何影响动态网络指标。
  • 真正的源数据有多大?如果您正在聚合或过滤该新矩阵,则可以执行“懒惰”expand.grid 而不会耗尽内存并导致 R 崩溃。

标签: r


【解决方案1】:

如果组合数量较少,这将起作用:

t(do.call(expand.grid, mapply(seq, Date1, Date2, SIMPLIFY = FALSE)))

不幸的是,从您的评论中,我推断您拥有相对大量的组合,从而粉碎了一次处理所有组合的机会。我建议您可以使用https://stackoverflow.com/a/36144255/3358272,在https://gist.github.com/r2evans/e5531cbab8cf421d14ed 稍作更新。重点是遍历每个组合并单独使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多