簡體   English   中英

如何為多個數據幀將列名設置為小寫?

[英]How do I set column names to lower case for multiple dataframes?

我有一組具有相同列標題的數據幀,除了一些列名稱大寫,一些列小寫。 我想將所有列名稱轉換為小寫,以便我可以創建一個大的數據幀。

我似乎無法讓colnames()在任何循環中工作或應用我寫。 附:

#create dfs
df1<-data.frame("A" = 1:10, "B" = 2:11)
df2<-data.frame("a" = 3:12, "b" = 4:13)
df3<-data.frame("a" = 5:14, "b" = 6:15)
#I have many more dfs in my actual data

#make list of dfs, define lowercasing function, apply across df list
dfs<-ls(pattern = "df")
lowercols<-function(df){colnames(get(df))<-tolower(colnames(get(df)))}
lapply(dfs, lowercols)

我收到以下錯誤:

Error in colnames(get(df)) <- tolower(colnames(get(df))) : 
  could not find function "get<-"

如何將所有數據框更改為具有小寫列名?

以下應該有效:

dfList <- lapply(lapply(dfs,get),function(x) {colnames(x) <- tolower(colnames(x));x})

這樣的問題通常源於你沒有將所有數據框放在單個數據結構中,然后被迫使用尷尬的東西,比如get

這並不是說在我的代碼,我使用lapplyget實際首先創建的數據幀的一個列表,然后改變其colnames。

您還應該知道您的lowercols功能非常類似於R。 R函數通常不會以不返回任何內容的方式調用,但會產生副作用。 如果你試圖以這種方式編寫函數(這是可能的),你可能會讓你的生活變得困難並且存在范圍問題。 請注意,在我的第二個lapply我明確地返回修改后的數據框。

@joran的回答在很大程度上重疊了我的風格和“你可能想要做這種不同的”信息。 然而,本着“給人一條魚,你喂他一天;給他一根尖銳的棍子,他可以戳自己的眼睛”的精神......

這是一個按照你想要的方式做你想做的事情:

dfnames <- ls(pattern = "df[0-9]+")  ## avoid 'dfnames' itself
lowercolnames <- function(df) {
    x <- get(df)
    colnames(x) <- tolower(colnames(x))
    ## normally I would use parent.frame(), but here we
    ##  have to go back TWO frames if this is used within lapply()
    assign(df,x,sys.frame(-2))
    ## OR (maybe simpler)
    ## assign(df,x,envir=.GlobalEnv)

    NULL
}

以下是兩個替代函數,它們小寫列名並返回結果:

lowerCN2 <- function(x) {
    colnames(x) <- tolower(colnames(x))
    x
}

我在這里包括plyr::rename的完整性,雖然在這種情況下它實際上比它的價值更麻煩。

lowerCN3 <- function(x) {
    plyr::rename(x,structure(tolower(colnames(x)),
                             names=colnames(x)))
}

dflist <- lapply(dfnames,get)
dflist <- lapply(dflist,lowerCN2)
dflist <- lapply(dflist,lowerCN3)

這不能直接回答你的問題,但它可以解決你試圖解決的問題; 你可以通過不同的名稱合並data.frames,例如:

df1 <- data.frame("A" = 1:10, "B" = 2:11, x=letters[1:10])
df2 <- data.frame("a" = 3:12, "b" = 4:13, y=LETTERS[1:10])
merge(df1, df2, by.x=c("A","B"), by.y=c("a","b"), all=TRUE)

暫無
暫無

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

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