在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
相关产品推荐
相关产品推荐

