2015-04-02 75 views
1

我需要一種有效的方法將多個數據框的列名轉換爲小寫字母。使用字符串中的名稱修改對象

假設我們有:

df1 <- data.frame(VAR1=c(1,2), VAR2=c("a", "b")) 
df2 <- data.frame(VAR1=c(TRUE,FALSE), VAR2=c("foo", "bar")) 

一種簡單的方式來獲得我想要的是:

names(df1) <- tolower(names(df1)) 
names(df2) <- tolower(names(df2)) 

,如果你有大量的數據幀,雖然有點乏味。
我需要更好的東西。

我以爲我可以在一個循環中使用get():

my.files <- ls() 
for(i in 1:2) names(get(my.files[i])) <- tolower(names(get(my.files[i]))) 

,但它不工作。我找不到使用lapply()的解決方案。
有沒有太多編碼修改大量數據幀的列名的建議?

回答

2

下面是一個使用setNames的單線程,這是一個很好的功能,可以修改對象的「名稱」屬性,而無需臨時創建副本。

for(i in ls(pattern = "df")) assign(i, setNames(get(i), tolower(names(get(i))))) 
df1 
# var1 var2 
# 1 1 a 
# 2 2 b 
df2 
# var1 var2 
# 1 TRUE foo 
# 2 FALSE bar 

一般做這種getassign常規的氣餒。最好將你的data.frames放在列表中,而不要放在.GlobalEnv中的一堆命名對象中。在你的情況下,你可以做類似如下的事情:

a <- list(df1 = df1, df2 = df2) 
a 
# $df1 
# VAR1 VAR2 
# 1 1 a 
# 2 2 b 
# 
# $df2 
# VAR1 VAR2 
# 1 TRUE foo 
# 2 FALSE bar 

lapply(a, function(x) setNames(x, tolower(names(x)))) 
# $df1 
# var1 var2 
# 1 1 a 
# 2 2 b 
# 
# $df2 
# var1 var2 
# 1 TRUE foo 
# 2 FALSE bar