You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:42:21