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

R语言基于多列字符串批量为所有配对创建邻近状态二元列

母婴配对邻近状态批量判定实现方案

基础背景

研究数据集为母婴配对进食行为观测记录,核心字段包括:

  • Individual:观测对象唯一标识
  • Food Consumed:进食行为对应的食物记录
  • In.Contact/In.2m/In.5m:不同距离阈值范围内出现的人员信息,真实场景下同类邻近距离列数量更多
  • DyadID:母婴配对组标识,共12组24个观测对象(例如Ap-Aap、Re-Red为两组独立配对),同组两个对象通过该字段关联
    需求为新增二元字段Dyad.Proximity:同组配对对象出现在任意邻近距离列中时取值为1,否则为0,要求逻辑可批量适配所有配对,无需逐一枚举列名、逐组编写判定规则,避免重复操作。

原有代码问题

此前编写的两段代码均无法满足需求,问题如下:

  1. 第一段存在语法错误:find()函数调用、c_across()内匹配逻辑写法不符合R语法规则,且仅针对Ap单一个体写死判定条件,无法批量适配所有配对
data1 <- data %>% 
    mutate(Dyad.Proximity = ifelse(Individual == "Ap" & 
                          find(c_across(In.Contact:In.5m) = "Aap"),
                       "1", "0"))
  1. 第二段触发Error in across(): ! 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.05 16:15:46