R使用subset筛选列时报错:double转integer精度丢失怎么解决?
R语言subset筛选列报错解决方案
错误原因
你提前计算的POS、NEG、OPT等子量表得分是存储在全局环境的独立向量,没有被添加到原始数据框data的列中。subset()的select参数会优先读取数据框内的列名,找不到对应列时就会把你写的POS等变量当成数值下标去索引列,你的子量表得分是double类型,R尝试转换为整数下标时丢失精度,因此触发报错。
解决方案
方案1:先将子量表写入原数据框再筛选
先把所有计算好的子量表赋值为data的新列,再执行subset操作:
# 将子量表得分写入原数据框 data$POS <- rowMeans(data[,c("PANAS1", "PANAS3", "PANAS4","PANAS6", "PANAS10", "PANAS11", "PANAS13","PANAS15", "PANAS17", "PANAS18")]) data$NEG <- rowMeans(data[,c("PANAS2", "PANAS5", "PANAS7","PANAS8", "PANAS9", "PANAS12", "PANAS14","PANAS16","PANAS19", "PANAS20")]) data$OPT <- rowSums(data[,c("OPT1","OPT2","OPT3")]) # 其余需要用到的子量表(SELBSTW、LZ等)都按照相同逻辑赋值到data的列中 # 执行列筛选 dat <- subset(data, select = c(CODE, GRUPPE, ZEITPUNKT, POS, NEG, SELBSTW, LZ, ERFOLG , MISSERFOLG , OPT , CES, RISK, CESPSYCH ,CESSOMAT, HERAUS, SHAME, SELF ))
方案2:直接构造新数据框(不修改原数据)
不需要调用subset,直接将需要的列拼接为新数据框:
dat <- data.frame( CODE = data$CODE, GRUPPE = data$GRUPPE, ZEITPUNKT = data$ZEITPUNKT, POS = POS, NEG = NEG, OPT = OPT, SELBSTW = data$SELBSTW, LZ = data$LZ, ERFOLG = data$ERFOLG, MISSERFOLG = data$MISSERFOLG, CES = data$CES, RISK = data$RISK, CESPSYCH = data$CESPSYCH, CESSOMAT = data$CESSOMAT, HERAUS = data$HERAUS, SHAME = data$SHAME, SELF = data$SELF )
注意事项
subset的select参数只能识别目标数据框内存在的列名,不能直接传入全局环境中的独立向量作为列名参数。
内容的提问来源于stack exchange,提问作者Janine
相关产品推荐
相关产品推荐

