在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
相关产品推荐
相关产品推荐

