Bioconductor 包安装踩坑与排查
记录 R 语言里用 BiocManager 装 Bioconductor 包时遇到的几个高频报错,包括镜像源覆盖、RDS 缓存损坏、依赖缺失、网络和字体乱码,以及一套能稳定跑通的安装配置。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-07-25 07:15:41 R DataFrame dplyr data.table
平时用 R 处理表格数据,列顺序这事儿说大不大,但一到出报告、对齐接口字段的时候就会频繁碰上。
下面把自己实际在用的几种方式理一遍,从最顺手的开始说。
最常用的肯定还是 dplyr 里的 select。管道的写法读起来很直白,列名按你想出现的顺序往 select 里一扔就行:
library(dplyr)
df <- data.frame(A = 1:3, B = 4:6, C = 7:9)
df <- df %>% select(C, A, B)
print(df)
select 里参数的顺序就是新表的列顺序,不需要额外记什么,写完就能跑。
如果你的表列很多,只想把某几列提前,剩下的保持原位,可以配合 everything(),不过这里只聊纯重排,先不展开。
如果懒得加载任何包,最直接的办法就是列索引。R 的 data.frame 本质上就是列表,直接用列号向量去取子集,顺序自然就改了:
df <- data.frame(A = 1:3, B = 4:6, C = 7:9)
df <- df[, c(3, 1, 2)]
print(df)
c(3,1,2) 对应原来的第三列、第一列、第二列,也就是 C、A、B。这种写法零依赖,写临时脚本时很轻便。
但有一个地方容易踩坑:一旦列数多了,光靠数字很容易搞混,回头再看脚本可能完全忘了 5 是哪个字段。所以列少的时候用用没问题,列一多我基本就转回用列名了。
数据量上来之后,我会切到 data.table。重排列的写法稍微绕一点,需要把 with 参数设成 FALSE,然后传列名向量:
library(data.table)
df <- data.frame(A = 1:3, B = 4:6, C = 7:9)
setDT(df)
df <- df[, c("C", "A", "B"), with = FALSE]
print(df)
如果不写 with = FALSE,data.table 会以为你要在 j 表达式里直接拿 C、A、B 这几个对象去算,而不是取列。
线上跑 ETL 的时候,因为 data.table 在内存和处理速度上都比较靠谱,习惯之后会经常这么写。另外 setDT 是原地转换,不会复制一份,对大表友好很多。
还有一种办法是用 subset 函数,它本职是做筛选的,但通过 select 参数也能顺手调个列序:
df <- data.frame(A = 1:3, B = 4:6, C = 7:9)
df <- subset(df, select = c(C, A, B))
print(df)
能跑,不过多数人不会首选它来做这件事,毕竟语义上 subset 主要是“取子集”,用它调顺序多少有点偏门,知道有这么个用法就行。
这几种方式没有绝对的好坏。
平时写分析脚本、互动探索的时候,我一般 dplyr 一把梭;如果是跑批、接上游宽表,就换成 data.table,稳一点;临时小数据顺手用列索引;subset 基本只在代码里看到别人写的时候用一下。选哪把刀,还是看具体场景。
上一篇: Linux下查用户列表,这三招够用了
记录 R 语言里用 BiocManager 装 Bioconductor 包时遇到的几个高频报错,包括镜像源覆盖、RDS 缓存损坏、依赖缺失、网络和字体乱码,以及一套能稳定跑通的安装配置。
在 R 4.4.3 上安装 ShortRead 遇到 “version same or greater” 警告,记录从排查到 force = TRUE 解决的过程。