簡體   English   中英

如何重命名 R 中列名的特定部分?

[英]How to rename specific part of column names in R?

我有一些列名如下jan_20_5feb_20_7mar_20_3apr_20_9等。

我有 12 個這樣的列,並希望消除第二個“_”和 append 之后的所有內容,這些內容由三個一組共同組成,以便輸出如下內容: jan_20_winterfeb_20_wintermar_20_winterapr_20_springmay_20_springjun_20_springjul_20_summer等。

我怎樣才能在 R 中以有效的方式解決這個問題?

先感謝您

您可以使用stringr ,一些正則表達式查找字符串中的最后一個數字,然后用季節向量替換它?

library(stringr)

# Fake data
df <- data.frame(matrix(ncol = 12, nrow = 0))
colnames(df) <- paste(month.abb, 20:31, 4:15, sep = "_")

# Replacement
names(df) <- str_replace(names(df),
                         "\\d+$",
                         rep(c("winter", "spring", "summer", "autumn"), each = 3))

df

Output:

 [1] Jan_20_winter Feb_21_winter Mar_22_winter Apr_23_spring May_24_spring Jun_25_spring Jul_26_summer
 [8] Aug_27_summer Sep_28_summer Oct_29_autumn Nov_30_autumn Dec_31_autumn
<0 rows> (or 0-length row.names)

根據格式,這可能會幫助您:

# example colnames
cn <- c("jan_20_5", "feb_20_7", "mar_20_3", "apr_20_9", "may_20_18", "jun_20_8", "jul_20_4", "aug_20_7", "sep_20_5", "oct_20_4")


labl <- setNames(
 gl(4,3, labels = c("winter", "spring", "summer", "fall")),
 tolower(month.abb)
)

paste0(gsub("(.*_)(.*)", "\\1", cn), labl[gsub("_.*", "", cn)])
#>  [1] "jan_20_winter" "feb_20_winter" "mar_20_winter" "apr_20_spring"
#>  [5] "may_20_spring" "jun_20_spring" "jul_20_summer" "aug_20_summer"
#>  [9] "sep_20_summer" "oct_20_fall"

代表 package (v2.0.1) 於 2022 年 7 月 27 日創建

您可以將tolower(month.abb)簡單映射到季節(在下面的示例中,我將月份 1:3、4:6、7:9 和 10:12 映射到冬季,spring,夏季,秋季,但您可以調整它),然后替換列名如下:

season=setNames(rep(c("winter","spring", "summer", "fall"),each=3),tolower(month.abb))

names(data) = sapply(str_remove(names(data),"_[0-9]{1,2}$"), \(k) {
  paste0(k,"_",season[[substr(k,1,3)]])
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM