如何对reshape2的melt对象筛选并获取正确变量名
解决melt对象筛选后获取变量名异常的问题
你遇到的问题是:melt后的variable列是因子类型,直接提取后和字符向量拼接时,因子会被转为对应的整数编码,所以得到了"1"而非预期的"varA"。
解决方案1:提取时转换为字符类型
修改提取variable的步骤,将因子转为字符:
library(reshape2) # 初始化数据框 dftmp <- data.frame(id=1:3, varA=1:3, varB=4:6, varC=7:9) # 融化数据框 melttmp <- melt(dftmp, id.vars="id") # 筛选value==1的行,并将variable转为字符类型 varValue1 <- as.character(subset(melttmp, value==1)$variable) # 拼接目标向量 output <- c("varD", varValue1) output # 输出结果:[1] "varD" "varA"
解决方案2:melt时禁用因子转换
在调用melt()时指定stringsAsFactors = FALSE,让variable列直接以字符类型存储:
library(reshape2) dftmp <- data.frame(id=1:3, varA=1:3, varB=4:6, varC=7:9) # 融化时设置stringsAsFactors=FALSE,避免variable转为因子 melttmp <- melt(dftmp, id.vars="id", stringsAsFactors = FALSE) varValue1 <- subset(melttmp, value==1)$variable output <- c("varD", varValue1) output # 输出结果:[1] "varD" "varA"
原因说明
旧版本R中,data.frame()默认会将字符列转换为因子,reshape2::melt()处理后,variable列会保留因子类型。当因子与字符向量拼接时,R会自动把因子转为其内部的整数编码(varA在因子中的编码是1),因此出现了"1"的错误输出。通过上述两种方法,就能确保获取到的是变量名字符串。
内容的提问来源于stack exchange,提问作者Yacine Hajji
相关产品推荐
相关产品推荐

