新创建的数据框丢失向量类别标签问题求助
问题:用
cbind()组合因子向量后,类别标签丢失的解决办法 嗨,我太懂你这个困扰了!你明明把y15和y16处理成了带自定义标签("2","3","4","5")的因子,结果用cbind()再转成数据框后,标签全变成了底层的整数编码(1、2、3、4),完全不是你想要的样子对吧?
先还原下你的问题场景
你先处理出了三个向量:
# 提取ID plantid <- dynamics$id # 处理2015年数据为因子 y15 <- dynamics$y2015 year15 <- cut(y15, breaks = c(-Inf, 50, 100, 150, Inf), labels = c("2", "3", "4", "5")) # 处理2016年数据为因子 y16 <- dynamics$y2016 year16 <- cut(y16, breaks = c(-Inf, 50, 100, 150, Inf), labels = c("2", "3", "4", "5"))
然后用cbind()组合:
SD1 = data.frame(cbind(plantid, year15, year16)) head(SD1)
结果得到的是:
> head(SD1) plantid year15 year16 1 1 4 NA 2 2 3 4 3 3 4 4 4 4 4 4 5 5 3 4 6 6 3 4
原本的因子标签"2""3""4""5"全变成了1-4的整数,这可太闹心了!
问题根源
cbind()这个函数会把因子类型强制转换成整数(因为因子在R里的底层存储就是整数,标签只是映射关系),当你把cbind()的结果丢给data.frame()时,它只会保留这个整数数值,而丢失了因子的标签和水平信息。
解决办法
给你三个简单的解决思路,任选其一就行:
方法1:直接用data.frame()组合,跳过cbind()
这是最简单的办法!data.frame()本身就可以直接接收多个向量作为参数,而且会完整保留每个向量的类型(包括因子的标签):
SD1 <- data.frame(plantid, year15, year16) head(SD1)
你会看到结果里的year15和year16依然是带"2""3""4""5"标签的因子,完全符合预期!
方法2:如果非要用cbind(),事后把列转回因子
要是你因为某些原因必须用cbind(),那可以在组合后,把year15和year16列重新转换成因子,指定原来的水平和标签:
SD1 <- data.frame(cbind(plantid, year15, year16)) # 重新转换为因子,指定levels和labels SD1$year15 <- factor(SD1$year15, levels = 1:4, labels = c("2", "3", "4", "5")) SD1$year16 <- factor(SD1$year16, levels = 1:4, labels = c("2", "3", "4", "5")) head(SD1)
这样也能把标签恢复回来。
方法3:用dplyr的bind_cols()(如果你熟悉tidyverse)
如果你平时用tidyverse系列的包,dplyr::bind_cols()也能完美保留向量的类型:
library(dplyr) SD1 <- bind_cols(plantid = plantid, year15 = year15, year16 = year16) head(SD1)
这个方法同样能保留因子的标签信息,而且代码也很简洁。
验证一下
不管用哪种方法,你都可以用str(SD1)来检查:
str(SD1)
你会看到year15和year16依然是Factor w/ 4 levels "2","3","4","5",标签完全没有丢失!
内容的提问来源于stack exchange,提问作者Muneer
相关产品推荐
相关产品推荐

