簡體   English   中英

重命名多個數據幀中的列,R

[英]Rename columns in multiple dataframes, R

我正在嘗試重命名多個data.frame的列。

舉個例子,假設我有一個data.frame s dfAdfBdfC 我寫了一個函數changeNames來相應地設置名稱然后使用lapply ,如下所示:

dfs <- list(dfA, dfB, dfC)
ChangeNames <- function(x) {
    names(x) <- c("A", "B", "C" )  
}
lapply(dfs, ChangeNames)

但是,這不能按預期工作。 似乎我沒有將新名稱分配給data.frame ,而只是創建新名稱。 我在這做錯了什么?

先感謝您!

這里有兩件事:

  • 1)您應該從函數中返回所需的值。 否則,將返回最后一個值。 在你的情況下,這是names(x) 所以,你應該添加最后一行, return(x)或簡單地x 所以,你的功能看起來像:

     ChangeNames <- function(x) { names(x) <- c("A", "B", "C" ) return(x) } 
  • 2) lapply不會通過引用修改輸入對象。 它適用於副本。 因此,您必須重新分配結果。 或者另一種方法是使用for-loops而不是lapply

     # option 1 dfs <- lapply(dfs, ChangeNames) # option 2 for (i in seq_along(dfs)) { names(dfs[[i]]) <- c("A", "B", "C") } 

即使使用for-loop ,你仍然會復制(因為names(.) <- . )。 您可以使用tracemem驗證這tracemem

df <- data.frame(x=1:5, y=6:10, z=11:15)
tracemem(df)
# [1] "<0x7f98ec24a480>"
names(df) <- c("A", "B", "C")
tracemem(df)
# [1] "<0x7f98e7f9e318>"

如果要通過引用進行修改,可以使用data.table包的setnames函數:

df <- data.frame(x=1:5, y=6:10, z=11:15)
require(data.table)
tracemem(df)
# [1] "<0x7f98ec76d7b0>"
setnames(df, c("A", "B", "C"))
tracemem(df)
# [1] "<0x7f98ec76d7b0>"

您看到映射到的內存位置df未更改。 名稱已通過參考修改。

如果數據幀不在列表中但僅在全局環境中,則可以使用字符串名稱向量引用它們。

dfs <- c("dfA", "dfB", "dfC")

for(df in dfs) {
  df.tmp <- get(df)
  names(df.tmp) <- c("A", "B", "C" ) 
  assign(df, df.tmp)
}

編輯

為簡化上述代碼,您可以使用

for(df in dfs)
  assign(df, setNames(get(df),  c("A", "B", "C")))

或使用不需要重新分配的data.table

for(df in c("dfA", "dfB"))
  data.table::setnames(get(df),  c("G", "H"))

我遇到了導入公共數據集並且必須重命名每個數據幀並重命名每個數據幀中的每一列以修剪空格,小寫和用句點替換內部空格的問題。

結合上述方法讓我:

for (eachdf in dfs)
  df.tmp <- get(eachdf) 
    for (eachcol in 1:length(df.tmp))
      colnames(df.tmp)[eachcol] <-
      str_trim(str_to_lower(str_replace_all(colnames(df.tmp)[eachcol], " ", ".")))
      }
  assign(eachdf, df.tmp) 
}

暫無
暫無

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

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