R语言如何将tibble的指定列转换为行名?
问题原因梳理
- 直接对tibble设置行名报错的原因:
tibble的设计原则就是不鼓励使用行名,直接给tibble赋值rownames会触发废弃警告;同时你用entrepreneur[,1]取tibble的列时,返回的是1列的tibble而非向量,赋值给行名时会因为类型/长度不匹配报长度无效的错误。 - 转data.frame后仍然报错的原因:
你运行as.data.frame(entrepreneur)时没有将转换后的结果赋值回原对象,后续操作的仍然是原来的tibble,所以报错不变。 column_to_rownames运行后无效果的原因:
该函数属于tibble包的工具函数,不会修改原数据集,只会返回处理后的新对象,你没有将返回结果赋值给变量,自然看不到变化。
可行的实现方案
方案1:使用column_to_rownames(适配tidyverse生态,推荐)
运行如下代码即可,注意要把结果赋值回entrepreneur变量:
entrepreneur <- column_to_rownames(entrepreneur, var = "Factors")
运行后可用head(entrepreneur)验证,第一列Factors已经变成行名,原列会被自动删除。
方案2:用base R实现
如果不想依赖tidyverse的函数,可按如下步骤操作:
# 先转为普通数据框,同时赋值回原变量 entrepreneur <- as.data.frame(entrepreneur) # 取列的时候加drop=TRUE,确保返回向量而非单列数据框 rownames(entrepreneur) <- entrepreneur[,1, drop=TRUE] # 可选:删除原来的第一列Factors entrepreneur <- entrepreneur[,-1]
补充注意事项
你的原始数据集中所有地区的数值都是字符格式,设置完行名后建议运行如下代码将所有列转为数值型,否则后续回归计算会报错:
# tidyverse写法 entrepreneur <- mutate_all(entrepreneur, as.numeric) # base R写法 entrepreneur[] <- lapply(entrepreneur, as.numeric)
如果后续仍需使用tibble格式做其他操作,也可以不设置行名,直接在建模时指定Factors列为分组/标识变量即可,tidyverse生态的建模函数(包括原生lm、glm和broom系列工具)都支持直接用列作为标识,不需要依赖行名。
内容的提问来源于stack exchange,提问作者Frank_Crunch
相关产品推荐
相关产品推荐

