R tidyverse:基于验证转换表将原始分数转t分数的优化方案咨询
优化原始分数与t分数、标准误的匹配代码
你当前的需求是将受试者原始分数和转换表中的t分数、标准误做匹配,但手动写case_when的方式在转换表行数较多时会非常冗余。最优雅的解决方式是使用数据连接,直接通过匹配列完成批量映射,无需逐行写判断条件。
原始冗余代码
raw<-data.frame(obsval=c(8,8,2,5,5)) tse<-data.frame(score=c(2,5,8),ts=c(1,2,3),se=c(0.1,0.2,0.3)) raw <- raw %>% mutate(tscore = case_when( obsval == tse[1,1] ~ tse[1,2], obsval == tse[2,1] ~ tse[2,2], obsval == tse[3,1] ~ tse[3,2], )) %>% mutate (SE = case_when( obsval == tse[1,1] ~ tse[1,3], obsval == tse[2,1] ~ tse[2,3], obsval == tse[3,1] ~ tse[3,3], ))
优化方案:使用left_join做数据连接
利用dplyr包的left_join函数,基于原始分数列和转换表的分数列做匹配,一次性将对应的t分数和标准误合并到原始数据中,无论转换表有多少行都能高效处理:
library(dplyr) raw<-data.frame(obsval=c(8,8,2,5,5)) tse<-data.frame(score=c(2,5,8),ts=c(1,2,3),se=c(0.1,0.2,0.3)) # 基于obsval和score列做左连接,自动匹配对应数据 raw_matched <- raw %>% left_join(tse, by = c("obsval" = "score")) %>% # 重命名列名符合需求 rename(tscore = ts, SE = se)
说明
left_join会保留raw中的所有行,同时将tse中匹配到的t分数和标准误对应填充- 如果原始数据中有转换表不存在的分数,对应
tscore和SE会显示为NA,方便后续处理异常值 - 这种写法完全避免了冗余的条件判断,转换表行数增加时无需修改代码,扩展性极强
内容的提问来源于stack exchange,提问作者Gitta
相关产品推荐
相关产品推荐

