You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中如何将tibble对象首列设为行名?解决相关报错

问题:把tibble第一列设为行名时出错

我想把tibble对象kirp.mut的第一列设为行名,跑了这段代码:

rownames(kirp.mut) <- kirp.mut[,1]
kirp.mut[,1] <- NULL

结果直接报错,还弹了警告:

> rownames(kirp.mut) <- kirp.mut[,1]
Error in `.rowNamesDF<-`(x, value = value) : invalid 'row.names' length
In addition: Warning message:
Setting row names on a tibble is deprecated. 

这个对象是283行8654列的tibble(同时属于tbl_df、tbl、data.frame类型),前10行10列的结构如下:

> dput(kirp.mut[1:10,1:10])
structure(list(sample_id = c("TCGA-2Z-A9J1-01A-11D-A382-10", 
"TCGA-B9-A5W9-01A-11D-A28G-10", "TCGA-GL-A59R-01A-11D-A26P-10", 
"TCGA-2Z-A9JM-01A-12D-A42J-10", "TCGA-A4-A57E-01A-11D-A26P-10", 
"TCGA-BQ-7044-01A-11D-1961-08", "TCGA-HE-7130-01A-11D-1961-08", 
"TCGA-UZ-A9Q0-01A-12D-A42J-10", "TCGA-HE-A5NI-01A-11D-A26P-10", 
"TCGA-WN-A9G9-01A-12D-A36X-10"), NBPF1 = c(1, 0, 0, 0, 0, 0, 
0, 0, 0, 0), CROCC = c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0), SF3A3 = c(1, 
0, 0, 0, 0, 0, 0, 0, 0, 0), GUCA2A = c(1, 0, 0, 0, 0, 0, 0, 0, 
0, 0), RAVER2 = c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0), ACADM = c(1, 
0, 0, 0, 0, 0, 0, 0, 0, 0), PDE4DIP = c(1, 0, 0, 0, 0, 0, 0, 
0, 0, 0), NUP210L = c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0), NCF2 = c(1, 
0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))
为啥会报错?
  • 「invalid 'row.names' length」:tibble用[,1]取列时,返回的是单列tibble,不是普通向量,而设置行名需要的是和行数匹配的向量,长度对不上就报错了。
  • 「Setting row names on a tibble is deprecated」:tibble本身就不推荐用行名,官方更建议用单独的列存标识信息,或者用专门的函数处理。
怎么解决?

方法1:用tidyverse官方推荐的函数(一步搞定)

用dplyr里的column_to_rownames函数,直接把指定列转成行名,同时删掉原列,还能转成data.frame:

library(dplyr)

# 转成带行名的data.frame
kirp.mut_df <- kirp.mut %>% 
  column_to_rownames(var = "sample_id")

方法2:修复原来的代码

要是想用基础R的方法,得先把第一列提取成向量(用[[1]]或者pull()),再设置行名,最好先转成data.frame避免警告:

# 提取第一列作为向量
row_names <- kirp.mut[[1]]
# 转成data.frame再设行名
kirp.mut_df <- as.data.frame(kirp.mut)
rownames(kirp.mut_df) <- row_names
# 删除原列
kirp.mut_df[,1] <- NULL

方法3:保留tibble结构(不用行名)

其实如果不是必须要行名,直接保留sample_id列就行,后续用dplyr的filter、group_by这些函数处理,更符合tidyverse的风格:

# 直接用原tibble就行,不用改
kirp.mut

内容的提问来源于stack exchange,提问作者melolilili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 05:10:56