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

将好友提名数据集转换为带互动类型标记的边列表(R语言)

将好友提名数据集转换为带互动标记的边列表(R实现)

问题说明

我有一份包含受访者ID、好友提名及对应互动方式的数据集,需要将其转换为边列表格式——每条记录对应一个受访者-好友关系,并保留互动类型标记(仅线上、仅线下、两者兼具)。

原始数据

df <- read.table(text= "id    friend1 friend2 friend3 friend1_phone   friend1_online  friend1_irl friend2_phone   friend2_online  friend2_irl friend3_phone   friend3_online  friend3_irl
1   4   12  7   1   1   1   0   0   1   0   1   0
2   8   6   7   0   1   1   0   1   0   1   0   0
3   9   NA  NA  1   1   1   NA  NA  NA  NA  NA  NA
4   15  7   2   1   0   0   0   0   0   1   1   1
5   2   20  7   1   0   1   1   0   0   0   1   0
6   19  NA  9   1   0   0   NA  NA  NA  1   1   1
7   12  20  8   1   0   1   0   0   1   0   1   0
8   3   17  10  0   0   0   0   1   0   1   1   0
9   NA  15  19  NA  NA  NA  1   1   0   0   1   0
10  2   16  11  1   1   1   0   0   1   0   1   0", header = TRUE)

期望输出

df_long <- read.table(text= "id   alter   virtual_only    irl_only    both
1   4   0   0   1
1   12  0   1   0
1   7   1   0   0
2   8   0   0   1
2   6   1   0   0
2   7   1   0   0
3   9   0   0   1
4   15  1   0   0
4   7   1   0   0
4   2   0   0   1
5   2   0   0   1
5   20  1   0   0
5   7   0   0   1
6   19  1   0   0
6   9   0   0   1
7   12  0   0   1
7   20  0   1   0
7   8   1   0   0
8   3   0   1   0
8   17  1   0   0
8   10  1   0   0
9   15  1   0   0
9   19  1   0   0
10  2   0   0   1
10  16  0   1   0
10  11  1   0   0", header = TRUE)

解决方案代码

使用tidyverse包的pivot_longer函数可以高效完成宽格式到长格式的转换,同时计算互动类型标记:

library(tidyverse)

df_long <- df %>%
  # 拆分好友列与对应的互动属性列
  pivot_longer(
    cols = -id,
    names_to = c("alter_num", ".value"),
    names_pattern = "friend(\\d+)_(.*)|friend(\\d+)",
    names_transform = list(alter_num = as.character)
  ) %>%
  # 合并好友ID列,处理无后缀的friendX列
  mutate(alter = coalesce(as.numeric(get("friend")), as.numeric(alter_num))) %>%
  # 过滤掉无好友提名的行
  filter(!is.na(alter)) %>%
  # 根据online和irl的值计算互动类型标记
  mutate(
    virtual_only = as.integer((online == 1) & (irl == 0)),
    irl_only = as.integer((irl == 1) & (online == 0)),
    both = as.integer((online == 1) & (irl == 1))
  ) %>%
  # 保留目标列并按ID排序
  select(id, alter, virtual_only, irl_only, both) %>%
  arrange(id)

代码说明

  • pivot_longer通过正则表达式匹配列名,将friend1、friend1_online等列拆分为好友编号和对应的互动属性(online、irl等)
  • coalesce函数确保每个行都能提取到有效的好友ID(alter)
  • 通过逻辑判断计算三种互动类型的0/1标记,与期望输出的规则完全匹配
  • 最后整理列顺序并按受访者ID排序,保证结果与示例一致

内容的提问来源于stack exchange,提问作者L. Tucker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:48:20