[英]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.