簡體   English   中英

使用 dplyr 完全以編程方式重命名 R 中的列

[英]Fully programmatically rename columns in R with dplyr

我在許多數據框中都有傳感器數據,用於幾種不同的傳感器類型。 我需要對數據幀執行 inner_joins 以便最終得到一個 dataframe。 給定傳感器類型的數據幀的列名是相同的,例如

> z501h001

  timeBgn soilTempMean soilTempVar
1 01:00:00     100        4
2 01:30:00     112        6
3 02:00:00     111        6

> z501h002

timeBgn soilTempMean soilTempVar
1 01:00:00     120        4
2 01:30:00     122        6
3 02:00:00     121        5

除了有更多的列。 不同類型的傳感器的列名稱不同(它們都有共同的timeBgn )。

我需要(在 R 中)一種靈活的方式來重命名列(這樣我就可以知道哪一列對應於哪個傳感器)基於為除 timeBgn 之外的所有列的現有列名添加后綴(這是 inner_join 的公共列將會完成)。

這是 Python / Pandas 相當於我正在嘗試做的事情:

def rename_cols_by_sensor(df, sensor_name):
    cols = df.columns
    new_cols = [f'{c}_{sensor_name}' if c!='timeBgn' else c for c in cols] 
    df.columns = new_cols

我在這里找到了大部分解決方案: 以編程方式重命名 dplyr 中的列

問題是我無法弄清楚如何以編程方式制作 cnames 向量。 我不想硬編碼所有無數的列名。 作為z501h001的示例,它需要看起來像

cnames <- c('soilTempMean' = 'soilTempMean_z501h001', 'soilTempVar' = 'soilTempVar_z501h001')

后綴(在示例中:_z501h001)可以傳遞給 function,因此這里無需討論獲取它。 使用names(df)很容易獲得原始名稱。 我只需要知道如何以這種c("character" = "other_character")格式將它們放在一起。

我努力了:

rename_by_loc <- function(df, loc) {
    old_names <- names(df)
    new_names <- c()
    loc = z501h001
    for (name in old_names) {
        if (name != "timeBgn") { 
            new_names <- c(new_names, paste(name, paste(name, loc, sep="_"), sep = " = ") )
        }
    }
    return(new_names)
}

但這給了我像"soilTempMean = soilTempMean_z501h001"這樣的名字

我需要 = 在字符串之外。 我嘗試了其他一些事情。 沒有一個是成功的。

使用 Pandas 這個問題是微不足道的,這讓我覺得我在 R 中遺漏了一些關於列重命名的內容。

謝謝。

我們可以使用mget獲取具有 object 模式的對象的所有值,名稱以“z”開頭,后跟 3 位數字,“h”,然后是list中的 3 位數字,然后使用imap循環遍歷list rename通過連接( str_c )具有 object 名稱的原始列,除 'timeBgn' 之外的所有列

library(dplyr)
library(purrr)
library(stringr)
out <- mget(ls(pattern = "^z\\d{3}h\\d{3}$")) %>%
    imap(~  {
             nm1 <- .y
             .x %>%
                rename_with(~ str_c(., "_", nm1), -timeBgn)
           })

output 將是一個list 如果我們需要更改原來object中的列名(不推薦),使用list2env

list2env(out, .GlobalEnv)

或使用base R

v1 <- ls(pattern = "^z\\d{3}h\\d{3}$")
for(v in v1) {
  tmp <- get(v)
  i1 <- names(tmp) != 'timeBgn'
  names(tmp)[i1] <- paste0(names(tmp)[i1], '_', v)
  assign(v, tmp)
}
              

暫無
暫無

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

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