R语言基于多列字符串批量为所有配对创建邻近状态二元列
母婴配对邻近状态批量判定实现方案
基础背景
研究数据集为母婴配对进食行为观测记录,核心字段包括:
Individual:观测对象唯一标识Food Consumed:进食行为对应的食物记录In.Contact/In.2m/In.5m:不同距离阈值范围内出现的人员信息,真实场景下同类邻近距离列数量更多DyadID:母婴配对组标识,共12组24个观测对象(例如Ap-Aap、Re-Red为两组独立配对),同组两个对象通过该字段关联
需求为新增二元字段Dyad.Proximity:同组配对对象出现在任意邻近距离列中时取值为1,否则为0,要求逻辑可批量适配所有配对,无需逐一枚举列名、逐组编写判定规则,避免重复操作。
原有代码问题
此前编写的两段代码均无法满足需求,问题如下:
- 第一段存在语法错误:
find()函数调用、c_across()内匹配逻辑写法不符合R语法规则,且仅针对Ap单一个体写死判定条件,无法批量适配所有配对
data1 <- data %>% mutate(Dyad.Proximity = ifelse(Individual == "Ap" & find(c_across(In.Contact:In.5m) = "Aap"), "1", "0"))
- 第二段触发
Error inacross(): ! Must be used inside dplyr verbs.报错:across()调用场景不符合要求,且同样仅支持单一个体判定,无批量处理能力
data1 <- data %>% mutate(Dyad.Proximity = c("0", "1")[(find(across(In.Contact:In.5m)) == "Aap" & Individual == "Ap")])
可直接运行的批量实现代码
核心逻辑为按配对组自动识别对应配对成员,批量匹配所有邻近距离列,无需手动配置配对关系和列名:
library(dplyr) data_result <- data %>% # 按母婴配对组分组,所有计算自动在组内完成 group_by(DyadID) %>% mutate( # 自动识别当前行观测对象对应的同组配对成员ID pair_id = unique(Individual[Individual != .data$Individual[row_number()]]), # 自动匹配所有以"In."开头的邻近距离列,检查是否存在配对成员ID Dyad.Proximity = as.integer( rowSums(across(starts_with("In."), ~ .x == pair_id), na.rm = T) > 0 ) ) %>% ungroup() %>% # 不需要中间生成的pair_id字段可执行下一行代码删除 # select(-pair_id)
逻辑说明
- 按
DyadID分组后自动识别每组的两个成员,无需手动编写12组配对的对应映射关系,新增配对组时无需修改代码 - 用
starts_with("In.")自动匹配所有邻近距离列,后续新增同命名规则的距离列时自动纳入检查范围,无需逐一枚举列名 - 用
rowSums()统计每行邻近距离列中匹配到配对成员的次数,匹配次数大于0即判定为同组邻近,取值为1,否则为0,逻辑稳定无dplyr语法兼容问题 - 最终生成的
Dyad.Proximity为整数型二元值,可直接用于后续统计分析
内容的提问来源于stack exchange,提问作者Juliette
相关产品推荐
相关产品推荐

