[英]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
。
這並不是說在我的代碼,我使用lapply
並get
實際首先創建的數據幀的一個列表,然后改變其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.