【发布时间】:2018-05-19 00:53:35
【问题描述】:
我有一个数据框,其中包含来自留言板的信息。数据如下所示:
require(dplyr)
require(tidyr)
df <- data.frame(author = c(2,4,8,16,32,64,128,256,512,1024),
topic = c(101,101,101,101,301,301,501,501,501,501),
time = c("2014-08-16 20:20:11", "2014-08-16 21:10:00", "2014-08-17 06:30:10",
"2014-08-17 10:08:32", "2014-08-20 22:23:01","2014-08-20 23:03:03",
"2014-08-25 17:05:01", "2014-08-25 19:15:10", "2014-08-25 20:07:11",
"2014-08-25 23:59:59"))
我想按主题查找作者的所有独特组合。我的目标是创建一个边缘按主题和时间范围分类的无向图。我使用下面的代码来得到这个:
test <- df %>% group_by(topic) %>% expand(nesting(author), author)
print(test, n = 20)
# A tibble: 36 x 3
# Groups: topic [3]
topic author author1
<dbl> <dbl> <dbl>
1 101. 2. 2.
2 101. 2. 4.
3 101. 2. 8.
4 101. 2. 16.
5 101. 4. 2.
6 101. 4. 4.
7 101. 4. 8.
8 101. 4. 16.
9 101. 8. 2.
10 101. 8. 4.
11 101. 8. 8.
12 101. 8. 16.
13 101. 16. 2.
14 101. 16. 4.
15 101. 16. 8.
16 101. 16. 16.
17 301. 32. 32.
18 301. 32. 64.
19 301. 64. 32.
20 301. 64. 64.
我在两件事上需要帮助:
- 如何删除交换的组合(例如第 2 行和第 5 行)?
- 对于每种组合,我都希望拥有以下属性:
-
start= 最早的主题帖子(使用 mutate,min = min(time)) -
durationof topic(上一篇关于主题的时间减去第一篇关于主题的时间,使用 mutate duration = max(time) - min(time)) -
posts的计数(使用汇总)?
-
【问题讨论】:
-
您到底想得到什么?按主题分组,然后生成每个不同的 author1-author2 组合?即使在哪里 author1==author2?
-
我不明白第二个问题"2。对于每个组合,我想有属性...",你想生成那些新列吗?第二个(汇总)表,还是在同一个组合扩展表中?但无论如何,您应该向我们展示您的代码尝试,或者至少是输出示例。
-
顺便说一句,没有 “交换组合” 这样的东西,它们是“排列”(因为它们依赖于顺序)。名为
expand/expand.grid...的函数和 SQL 连接通常会为您提供排列,而不是组合。 -
好的,你能接受一些答案吗?
combn(x, m=2)对于长度为 1000 或更长的长 x 的 big-O 运行时(/内存)性能是一个单独的问题,请询问。我怀疑限制因素是你的内存使用而不是 CPU,正如我提到的,解决方案是使用文件支持的对象,或者根据需要将你的大groupby(datetime)拆分成尽可能多的不相交的datetime块。没有理由将整个结果同时保存在内存中。但无论如何,这些都是单独的问题。 -
至于内存使用情况,您将日期时间存储为字符串(120 字节); POSIXct 将占用大约 520 字节,POSIXlt 大约 1816 字节,但
object.size(as.integer(as.POSIXct("2014-08-16 20:20:11")))仅占用 48 字节(自纪元以来的秒数)。
标签: r dplyr combinations tidyr