假设我有以下data.frame
由多行(此处未显示)和31列组成。第一个是(并且应该保留)标记为“gene_ID”,从第二个一直到第三十列,它们都有奇怪的名称,如下所示:
|gene_ID | weird1| weird2|all_the_way_to | weird30|
|:-------|------:|------:|:--------------|-------:|
|BPK282x | 4| 1|... | 7|
|BPK282y | 5| 2|... | 8|
|BPK282z | 6| 3|... | 9|
我想用这样的模式重命名所有30个列的名称:TPM_1,TPM_2,TPM_3,TPM_4 ..... TPM_30,产生下表:
|gene_ID | TPM_1| TPM_2|all_the_way_to | TPM_3|
|:-------|-----:|-----:|:--------------|-----:|
|BPK282x | 4| 1|... | 7|
|BPK282y | 5| 2|... | 8|
|BPK282z | 6| 3|... | 9|
我可以通过以下方式单独重命名列:
names(data.frame) <- c("gene_ID", "TPM_1", "TPM_2", "TPM_3", ..., "TPM_30")
但我想知道是否有办法通过使用一个函数来自动化该过程,该函数会对列的名称使用类似算术级数的函数。换句话说,我试图找到一种方法来重命名我的列的模式(TPM_跟随一个数字),因为列的名称将是“TPM_n”,“TPM_n + 1”,“TPM_n + 2”,TPM_n + 3“,一直到”TPM_n + 30“
答案 0 :(得分:4)
您可以使用paste0
colnames(df) <- paste0("TPM_", 1:30)
#[1] "TPM_1" "TPM_2" "TPM_3" "TPM_4" "TPM_5" "TPM_6" "TPM_7" "TPM_8" "TPM_9"
#[10]"TPM_10" "TPM_11" "TPM_12" TPM_13" "TPM_14" "TPM_15" "TPM_16" "TPM_17" "TPM_18"
#[19]"TPM_19" TPM_20" "TPM_21" "TPM_22" "TPM_23" "TPM_24" "TPM_25" "TPM_26" "TPM_27"
#[28] "TPM_28" "TPM_29" "TPM_30"
您始终可以指定要更改的列的索引
colnames(df)[2:31] <- paste0("TPM_", 1:30)
答案 1 :(得分:1)
我们可以使用paste
。
colnames(df1)[-1] <- paste0("TPM_", head(seq_along(df1),-1))
colnames(df1)
#[1] "gene_ID" "TPM_1" "TPM_2"
在这里,我们仅命名第2列到最后一列。 OP提到第一列是&#34; gene_ID&#34;。此外,当更改数据集时,这更通用,我们不需要手动计数1,2,3,4等,以检查有30列或100 ..
df1 <- structure(list(gene_ID = c("BPK282x", "BPK282y", "BPK282z"),
weird1 = 4:6, weird2 = 1:3), .Names = c("gene_ID", "weird1",
"weird2"), class = "data.frame", row.names = c(NA, -3L))
答案 2 :(得分:1)
使用paste
组合字符串,以及沿列的数字级数(例如seq_along
)。在标准iris
数据集中使用所需的输出:
names(iris) <- paste("TMP", seq_along(iris), sep = "_")