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

在R中利用setdiff排序列、添加新变量及数据去重问题

解决R语言数据集格式化与去重问题

前置准备

先加载所需工具包:

library(tidyverse)
library(data.table) # 适配你之前用的rbindlist
library(readxl)

假设合并后的数据集名为df,预设的Term顺序列表为termList(示例:termList <- c("TermA", "TermB", "TermC"))。


1. 拆分Origin列为ParNum和Day

从Origin的文件路径中提取受试者编号和测试日期:

df <- df %>%
  mutate(
    ParNum = str_extract(Origin, "SUB\\d+"), # 提取SUB开头的受试者编号
    Day = str_extract(Origin, "S0\\d") %>% str_remove("S0") %>% as.integer() # 提取S0X格式的日期并转成数字
  )

2. 按termList顺序排序Term列

将Term转为因子并指定顺序,再完成排序:

df <- df %>%
  mutate(Term = factor(Term, levels = termList)) %>%
  arrange(ParNum, Term)

3. 为每个受试者补全缺失Term

按受试者分组,补全未出现的Term,对应Day设为0、Condition设为"U":

df_complete <- df %>%
  group_by(ParNum) %>%
  complete(Term = termList, 
           fill = list(Condition = "U", Day = 0)) %>%
  ungroup()

4. 去除非"U"条件的重复Term

针对Condition不为"U"的行,按ParNum、Day、Term去重,保留唯一记录后再与Condition为"U"的行合并:

df_final <- df_complete %>%
  # 处理非U条件的重复项
  filter(Condition != "U") %>%
  distinct(ParNum, Day, Term, .keep_all = TRUE) %>%
  # 合并U条件的补全行
  bind_rows(df_complete %>% filter(Condition == "U")) %>%
  # 重新按指定顺序排序
  arrange(ParNum, Term)

关键说明

  • 提取Origin信息时,可根据实际文件路径格式调整正则表达式(比如SUB后是两位数字就用SUB\\d{2})。
  • complete函数比apply+setdiff更简洁稳定,能自动补全分组内缺失的Term并设置默认值。
  • distinct去重时,.keep_all = TRUE会保留该行所有列信息,仅去除指定组合的重复项。

内容的提问来源于stack exchange,提问作者Maranta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:21:08