如何用dplyr重命名无列名的矩阵列
使用dplyr重命名无列名矩阵的列
先还原你的场景代码,方便大家理解问题:
set.seed(1234) v1 <- table(round(runif(50,0,10))) v2 <- table(round(runif(50,0,10))) library(dplyr) # 得到无列名的转置矩阵 result_matrix <- bind_rows(v1,v2) %>% t
你遇到的问题是:这个转置后的矩阵没有列名,常规的rename(new_name=old_name)因为找不到旧列名而失效,试过多种写法都没成功,想要纯dplyr的解决方案(不用base R的colnames<-)。
最简洁的解决方案:提前命名行,转置后自动得到列名
其实不用等到转置后再重命名,在bind_rows的时候直接给行指定名字,转置后这些行名就会变成矩阵的列名,一步到位:
bind_rows(v1 = v1, v2 = v2) %>% t
运行这段代码后,你会直接得到带v1和v2列名的矩阵,完全符合需求。
如果已经得到无列名矩阵,用dplyr工具重命名
要是你已经拿到了无列名的矩阵,也可以用dplyr的set_names()或者rename_with()来处理,不过需要先转成dplyr更擅长处理的tibble(处理完再转回矩阵即可):
方法1:用dplyr::set_names()
result_matrix %>% as_tibble(.name_repair = "minimal") %>% # 转成tibble,保留无列名状态 set_names(c("v1", "v2")) %>% # 直接赋值新列名 as.matrix()
方法2:用rename_with()
result_matrix %>% as_tibble(.name_repair = "minimal") %>% rename_with(~ c("v1", "v2"), everything()) %>% # 给所有列批量重命名 as.matrix()
为什么你之前的尝试都失败了?
rename("v1","v2"):rename()要求传入键值对(新列名=旧列名),直接传字符串它无法识别对应关系rename(v1=1, v2=2):rename()的旧列名参数需要是列名(字符串),不能用位置索引数字rename_(.dots = c("v1","v2")):这是dplyr旧版本的废弃语法,而且.dots需要传入命名列表,不是普通字符串向量setNames(c("v1","v2")):你调用的是base R的setNames(),它需要第一个参数是要命名的对象,你只传了列名,所以无效;dplyr的set_names()是管道友好的,需要放在管道流中使用
内容的提问来源于stack exchange,提问作者Bastien
相关产品推荐
相关产品推荐

