基于tidyr按主题生成唯一作者组合及属性补充的技术求助
解决论坛主题作者组合与属性添加问题
首先先回顾下你的数据和当前的问题:你有一个记录论坛发帖信息的DataFrame,想要按主题构建无向图的作者组合,但目前用expand生成的结果里有重复的交换对(比如(2,4)和(4,2)),还需要给每个组合加上主题的时间范围、持续时长和发帖量属性。
先把你的原始数据代码放出来方便参考:
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") )
问题1:移除交换组合(可选移除自环)
要得到无向图的唯一作者对,核心思路是让每个组合保持有序状态(比如第一个作者ID ≤ 第二个作者ID),这样就不会出现(2,4)和(4,2)这种重复的交换对了。另外如果不需要作者和自己的自环组合,也可以一起过滤掉。
修改后的代码如下:
test <- df %>% group_by(topic) %>% # 先去重每个主题下的作者,避免重复处理同一个作者 distinct(author) %>% # 生成所有作者组合 expand(author, author1 = author) %>% # 只保留author ≤ author1的有序对,消除交换重复 filter(author <= author1) %>% # 如果你不需要自环(作者和自己的组合),就打开下面这行注释 # filter(author != author1) ungroup() print(test, n = 20)
运行后,主题101的结果就会变成这样,没有交换重复的情况了:
# A tibble: 10 x 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 4 6 101 4 8 7 101 4 16 8 101 8 8 9 101 8 16 10 101 16 16
问题2:添加主题的时间与发帖量属性
要给每个作者组合加上start、duration和posts属性,我们可以先对原数据按主题做一次聚合统计,再把统计结果和作者组合表关联起来。
完整的实现代码如下:
# 第一步:按主题计算所需属性 topic_stats <- df %>% group_by(topic) %>% summarize( start = min(as.POSIXct(time)), # 先把时间转成POSIXct格式才能计算 duration = max(as.POSIXct(time)) - start, posts = n() # 统计该主题的发帖总数 ) %>% ungroup() # 第二步:生成唯一作者组合并关联属性 final_result <- df %>% group_by(topic) %>% distinct(author) %>% expand(author, author1 = author) %>% filter(author <= author1) %>% # 不需要自环就打开这行 # filter(author != author1) ungroup() %>% # 把主题属性关联到作者组合表上 left_join(topic_stats, by = "topic") print(final_result, n = 20)
代码说明:
as.POSIXct(time):必须把字符串格式的时间转换成时间类型,才能正确计算最小/最大时间和时间差;如果需要把duration转换成数值(比如秒数),可以改成as.numeric(max(as.POSIXct(time)) - start)。left_join:确保每个作者组合都能匹配到对应的主题属性,不会丢失数据。
运行后的结果示例(主题101部分):
# A tibble: 10 x 6 topic author author1 start duration posts <dbl> <dbl> <dbl> <dttm> <drtn> <int> 1 101 2 2 2014-08-16 20:20:11 13.89472 4 2 101 2 4 2014-08-16 20:20:11 13.89472 4 3 101 2 8 2014-08-16 20:20:11 13.89472 4 4 101 2 16 2014-08-16 20:20:11 13.89472 4 5 101 4 4 2014-08-16 20:20:11 13.89472 4 6 101 4 8 2014-08-16 20:20:11 13.89472 4 7 101 4 16 2014-08-16 20:20:11 13.89472 4 8 101 8 8 2014-08-16 20:20:11 13.89472 4 9 101 8 16 2014-08-16 20:20:11 13.89472 4 10 101 16 16 2014-08-16 20:20:11 13.89472 4
这样就同时解决了你的两个问题:得到了无向图所需的唯一作者组合,并且每个组合都带上了对应的主题时间范围、持续时长和发帖量属性。
内容的提问来源于stack exchange,提问作者aterhorst
相关产品推荐
相关产品推荐

