将好友提名数据集转换为带互动类型标记的边列表(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
相关产品推荐
相关产品推荐

