R语言如何将demo变量匹配复制到同一被试多测次的analysis数据集
数据集匹配赋值问题说明与解决
问题描述
现有两个数据集demo和analysis,需要将demo中的beeptime变量匹配复制到analysis数据集中。
- demo数据集结构如下:

- analysis数据集结构如下:

原尝试运行代码:
analysis = analysis %>% mutate(ethnic = case_when(analysis$subjno %in% demo$subjno ~ demo$beeptime))
收到报错:
must be length 5410 or one, not 193.
报错原因
你的判断完全正确:analysis中每个被试存在多条测量数据(共5410行),demo中每个被试仅1行记录(共193行)。case_when()为逐行运算函数,要求赋值右侧向量长度与analysis行数一致,193长度的demo$beeptime无法适配5410行的数据集,因此触发报错。
解决方法
使用dplyr的左连接函数left_join(),按公共字段subjno进行匹配,函数会自动将demo中每个被试对应的beeptime值,同步匹配到analysis中该被试对应的所有行,自动适配长度:
- 若需直接新增
beeptime列到analysis中,运行以下代码:
# 仅提取demo的subjno、beeptime字段匹配,避免引入demo其他冗余列 analysis <- dplyr::left_join(analysis, demo %>% dplyr::select(subjno, beeptime), by = "subjno")
- 若要按原代码逻辑将匹配到的
beeptime赋值为新列ethnic,可在连接后重命名列:
analysis <- dplyr::left_join(analysis, demo %>% dplyr::select(subjno, beeptime), by = "subjno") %>% dplyr::rename(ethnic = beeptime)
注意事项
匹配前请确认两个数据集的subjno字段格式完全一致(同为数值型/字符型),避免因格式差异导致匹配结果出现NA。
内容的提问来源于stack exchange,提问作者Yisheng 37
相关产品推荐
相关产品推荐

